]> git.tdb.fi Git - libs/datafile.git/commitdiff
Use a common StatementKey structure for Loader and BinaryParser/Writer
authorMikko Rasa <tdb@tdb.fi>
Sat, 3 Aug 2013 12:14:11 +0000 (15:14 +0300)
committerMikko Rasa <tdb@tdb.fi>
Mon, 5 Aug 2013 11:57:21 +0000 (14:57 +0300)
source/binarydict.h [deleted file]
source/binaryparser.cpp
source/binaryparser.h
source/binarywriter.cpp
source/binarywriter.h
source/loader.cpp
source/loader.h
source/statement.h

diff --git a/source/binarydict.h b/source/binarydict.h
deleted file mode 100644 (file)
index 923ce39..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-#ifndef MSP_DATAFILE_BINARYDICT_H_
-#define MSP_DATAFILE_BINARYDICT_H_
-
-#include <string>
-
-namespace Msp {
-namespace DataFile {
-
-/**
-Stores statement information for binary files.
-*/
-struct DictEntry
-{
-       std::string keyword;
-       std::string args;
-
-       DictEntry() { }
-       DictEntry(const std::string &k, const std::string &a): keyword(k), args(a) { }
-
-       bool operator<(const DictEntry &o) const
-       { return keyword<o.keyword || (keyword==o.keyword && args<o.args); }
-};
-
-} // namespace DataFile
-} // namespace Msp
-
-#endif
index 796a592d3e84d05a70e2e8316abdcccbe543f3bf..7d1591de77105264a3d59fc2506c4bd0c03a9739 100644 (file)
@@ -27,9 +27,9 @@ BinaryParser::BinaryParser(Input &i, const string &s):
        first(true),
        float_precision(32)
 {
-       dict[-1] = DictEntry("__kwd", "iss");
-       dict[-2] = DictEntry("__str", "is");
-       dict[-3] = DictEntry("__flt", "i");
+       dict[-1] = StatementKey("__kwd", "iss");
+       dict[-2] = StatementKey("__str", "is");
+       dict[-3] = StatementKey("__flt", "i");
 }
 
 Statement BinaryParser::parse(bool raw)
@@ -50,7 +50,7 @@ Statement BinaryParser::parse(bool raw)
                                        if(!valid_signatures[j])
                                                throw bad_definition("__kwd");
 
-                       dict[id] = DictEntry(kw, args);
+                       dict[id] = StatementKey(kw, args);
                }
                else if(st.keyword=="__str")
                {
@@ -80,15 +80,15 @@ Statement BinaryParser::parse_statement(bool raw)
        if(!in)
                return Statement();
 
-       const DictEntry &de = get_item(dict, id);
+       const StatementKey &key = get_item(dict, id);
 
        Statement result;
-       result.keyword = de.keyword;
+       result.keyword = key.keyword;
        result.source = src;
 
-       for(unsigned j = 0; j<de.args.size(); ++j)
+       for(unsigned j=0; j<key.signature.size(); ++j)
        {
-               switch(de.args[j])
+               switch(key.signature[j])
                {
                case IntType::signature:
                        result.args.push_back(parse_int());
index e6735f2435a71c447450ecd58aacbf46342859be..d275290cbece483a6b1ec1b2b6e109da9f5806db 100644 (file)
@@ -2,7 +2,6 @@
 #define MSP_DATAFILE_BINARYPARSER_H_
 
 #include <map>
-#include "binarydict.h"
 #include "parsermode.h"
 #include "type.h"
 
@@ -15,7 +14,7 @@ Parses data in binary format.
 class BinaryParser: public ParserMode
 {
 private:
-       typedef std::map<int, DictEntry> Dictionary;
+       typedef std::map<int, StatementKey> Dictionary;
        typedef std::map<unsigned, std::string> StringMap;
 
        Dictionary dict;
index d1433304c251744a7a51c702a2b80b73b3d24139..087e140ddd5d1d1f79173afac9d3cb9f7e57fb8b 100644 (file)
@@ -16,9 +16,9 @@ BinaryWriter::BinaryWriter(Output &o):
        next_str_id(1),
        float_precision(32)
 {
-       dict[DictEntry("__kwd", "iss")] = -1;
-       dict[DictEntry("__str", "is")] = -2;
-       dict[DictEntry("__flt", "i")] = -3;
+       dict[StatementKey("__kwd", "iss")] = -1;
+       dict[StatementKey("__str", "is")] = -2;
+       dict[StatementKey("__flt", "i")] = -3;
 }
 
 void BinaryWriter::set_float_precision(unsigned fp)
@@ -40,7 +40,7 @@ void BinaryWriter::write(const Statement &st)
 
 void BinaryWriter::write_(const Statement &st)
 {
-       int id = get_item(dict, DictEntry(st.keyword, st.get_signature()));
+       int id = get_item(dict, StatementKey(st.keyword, st.get_signature()));
 
        write_int(id);
        for(Statement::Arguments::const_iterator j = st.args.begin(); j!=st.args.end(); ++j)
@@ -60,18 +60,18 @@ void BinaryWriter::write_(const Statement &st)
 
 void BinaryWriter::collect_keywords(const Statement &st)
 {
-       DictEntry de(st.keyword, st.get_signature());
+       StatementKey key(st.keyword, st.get_signature());
 
-       if(!dict.count(de))
+       if(!dict.count(key))
        {
                Statement kst;
                kst.keyword = "__kwd";
                kst.args.push_back(next_kwd_id);
-               kst.args.push_back(de.keyword);
-               kst.args.push_back(de.args);
+               kst.args.push_back(key.keyword);
+               kst.args.push_back(key.signature);
                write_(kst);
 
-               dict[de] = next_kwd_id++;
+               dict[key] = next_kwd_id++;
        }
 
        for(ValueArray::const_iterator i = st.args.begin(); i!=st.args.end(); ++i)
index 81b4a46dfe70d0c9851498afbd794ce13e1c9944..b10c5abdce2adc887f0c70bb5080eacc92efc518 100644 (file)
@@ -2,7 +2,7 @@
 #define MSP_DATAFILE_BINARYWRITER_H_
 
 #include <map>
-#include "binarydict.h"
+#include "statement.h"
 #include "type.h"
 #include "writermode.h"
 
@@ -15,7 +15,7 @@ Writes data in binary format.
 class BinaryWriter: public WriterMode
 {
 private:
-       typedef std::map<DictEntry, int> Dictionary;
+       typedef std::map<StatementKey, int> Dictionary;
        typedef std::map<std::string, unsigned> StringMap;
 
        Dictionary dict;
index bffa9fd31c6ccf5018535139aa119f859d3c36b0..2c0fbd12275ffdf4e54715a4ca05fc9524ce430d 100644 (file)
@@ -113,7 +113,7 @@ void Loader::load_statement(const Statement &st)
 
        try
        {
-               ActionKey key(st.keyword, st.get_signature());
+               StatementKey key(st.keyword, st.get_signature());
 
                if(!aux_loaders.empty() && !has_action(key))
                {
@@ -152,7 +152,7 @@ void Loader::load_sub_with(Loader &ldr)
 
 void Loader::add(const string &kwd, LoaderAction *act)
 {
-       ActionKey key(kwd, (act ? act->get_signature() : "*"));
+       StatementKey key(kwd, (act ? act->get_signature() : "*"));
        ActionMap::iterator i = actions.find(key);
        if(i!=actions.end())
        {
@@ -168,19 +168,19 @@ void Loader::add_auxiliary_loader(Loader &ldr)
        aux_loaders.push_back(&ldr);
 }
 
-bool Loader::has_action(const ActionKey &key) const
+bool Loader::has_action(const StatementKey &key) const
 {
-       ActionMap::const_iterator i = actions.lower_bound(ActionKey(key.keyword, string()));
+       ActionMap::const_iterator i = actions.lower_bound(StatementKey(key.keyword, string()));
        for(; (i!=actions.end() && i->first.keyword==key.keyword); ++i)
                if(signature_match(key.signature, i->first.signature))
                        return true;
        return false;
 }
 
-LoaderAction *Loader::find_action(const ActionKey &key) const
+LoaderAction *Loader::find_action(const StatementKey &key) const
 {
-       ActionMap::const_iterator begin = actions.lower_bound(ActionKey(key.keyword, string()));
-       ActionMap::const_iterator end = actions.upper_bound(ActionKey(key.keyword, "~"));
+       ActionMap::const_iterator begin = actions.lower_bound(StatementKey(key.keyword, string()));
+       ActionMap::const_iterator end = actions.upper_bound(StatementKey(key.keyword, "~"));
 
        if(begin==end)
                throw unknown_keyword(key.keyword);
@@ -199,18 +199,5 @@ const string &Loader::get_source() const
        return cur_st->source;
 }
 
-
-Loader::ActionKey::ActionKey(const string &k, const string &s):
-       keyword(k),
-       signature(s)
-{ }
-
-bool Loader::ActionKey::operator<(const ActionKey &other) const
-{
-       if(keyword!=other.keyword)
-               return keyword<other.keyword;
-       return signature<other.signature;
-}
-
 } // namespace DataFile
 } // namespace Msp
index dcbbd5dcda202bcd1e1af4f6da7c9f52df2a0f20..bb1292cc7b3c2740adc14a6c596bde54c4a59678 100644 (file)
@@ -35,17 +35,7 @@ See also classes ObjectLoader and CollectionObjectLoader in objectloader.h.
 class Loader
 {
 private:
-       struct ActionKey
-       {
-               std::string keyword;
-               std::string signature;
-
-               ActionKey(const std::string &, const std::string &);
-
-               bool operator<(const ActionKey &) const;
-       };
-
-       typedef std::map<ActionKey, LoaderAction *> ActionMap;
+       typedef std::map<StatementKey, LoaderAction *> ActionMap;
 
        ActionMap actions;
        const Statement *cur_st;
@@ -136,8 +126,8 @@ protected:
        void add_auxiliary_loader(Loader &);
 
 private:
-       bool has_action(const ActionKey &) const;
-       LoaderAction *find_action(const ActionKey &) const;
+       bool has_action(const StatementKey &) const;
+       LoaderAction *find_action(const StatementKey &) const;
 
 protected:
        /** Returns the source of the statement being processed.  This can be used
index f9287a51714f56e89719db5c2a3b6871f0889b81..1df34381b38630b97494764e5e6c2fd581c0723a 100644 (file)
@@ -36,6 +36,18 @@ public:
        { return append(v); }
 };
 
+struct StatementKey
+{
+       std::string keyword;
+       std::string signature;
+
+       StatementKey() { }
+       StatementKey(const std::string &k, const std::string &s): keyword(k), signature(s) { }
+
+       bool operator<(const StatementKey &o) const
+       { return keyword<o.keyword || (keyword==o.keyword && signature<o.signature); }
+};
+
 } // namespace DataFile
 } // namespace Msp