]> git.tdb.fi Git - libs/datafile.git/blobdiff - source/binarywriter.cpp
Add reverse name lookup to Collection
[libs/datafile.git] / source / binarywriter.cpp
index dd63d3dcefa03e32efd83af1f30b096e9ba54718..98dd2a9635317d56986ebff812867c263e25d5b9 100644 (file)
@@ -15,11 +15,11 @@ namespace DataFile {
 
 BinaryWriter::BinaryWriter(IO::Base &o):
        WriterMode(o),
-       next_st_id(3),
-       next_enum_id(1)
+       next_kwd_id(3),
+       next_str_id(1)
 {
-       dict[DictEntry("__st", "iss")]=1;
-       dict[DictEntry("__enum", "is")]=2;
+       dict[DictEntry("__kwd", "iss")]=1;
+       dict[DictEntry("__str", "is")]=2;
 }
 
 void BinaryWriter::write(const Statement &st)
@@ -72,26 +72,30 @@ void BinaryWriter::collect_keywords(const Statement &st)
        if(!dict.count(de))
        {
                Statement kst;
-               kst.keyword="__st";
-               kst.args.push_back(next_st_id);
+               kst.keyword="__kwd";
+               kst.args.push_back(next_kwd_id);
                kst.args.push_back(de.keyword);
                kst.args.push_back(de.args);
                write_(kst);
 
-               dict[de]=next_st_id++;
+               dict[de]=next_kwd_id++;
        }
 
        for(ValueArray::const_iterator i=st.args.begin(); i!=st.args.end(); ++i)
-               if(i->get_type()==ENUM && !enums.count(i->get_raw()))
+       {
+               const Type t=i->get_type();
+               const string &r=i->get_raw();
+               if((t==ENUM || (t==STRING && r.size()<32)) && !strings.count(r))
                {
-                       Statement est;
-                       est.keyword="__enum";
-                       est.args.push_back(next_enum_id);
-                       est.args.push_back(i->get_raw());
-                       write_(est);
+                       Statement sst;
+                       sst.keyword="__str";
+                       sst.args.push_back(next_str_id);
+                       sst.args.push_back(r);
+                       write_(sst);
 
-                       enums[i->get_raw()]=next_enum_id++;
+                       strings[r]=next_str_id++;
                }
+       }
 
        for(list<Statement>::const_iterator i=st.sub.begin(); i!=st.sub.end(); ++i)
                collect_keywords(*i);
@@ -112,8 +116,14 @@ void BinaryWriter::write_int(long long n)
 
 void BinaryWriter::write_string(const string &s)
 {
-       write_int(s.size());
-       out.write(s.data(), s.size());
+       StringMap::const_iterator i=strings.find(s);
+       if(i!=strings.end())
+               write_int(-static_cast<int>(i->second));
+       else
+       {
+               write_int(s.size());
+               out.write(s.data(), s.size());
+       }
 }
 
 void BinaryWriter::write_float(float f)
@@ -136,8 +146,8 @@ void BinaryWriter::write_float(float f)
 
 void BinaryWriter::write_enum(const string &e)
 {
-       EnumMap::const_iterator i=enums.find(e);
-       if(i==enums.end())
+       StringMap::const_iterator i=strings.find(e);
+       if(i==strings.end())
                throw InvalidParameterValue("Unknown enum");
        write_int(i->second);
 }