]> git.tdb.fi Git - libs/datafile.git/blobdiff - source/argumentstore.cpp
Cosmetic changes
[libs/datafile.git] / source / argumentstore.cpp
index 49bdbada1b2c5fa49bdb4b9e4158b9c901c8dc13..22cb11f5f7ccdca7547ccb3474a3eed09d27f967 100644 (file)
@@ -1,5 +1,8 @@
+#include <stdexcept>
 #include "argumentstore.h"
 
+using namespace std;
+
 namespace Msp {
 namespace DataFile {
 
@@ -19,7 +22,30 @@ ArgumentStore::ArgumentStore(const StatementInfo &n):
                }
 }
 
+ArgumentStore::ArgumentStore(const ArgumentStore &other):
+       info(other.info),
+       store(new char[info.args_size])
+{
+       copy_from(other.store);
+}
+
+ArgumentStore &ArgumentStore::operator=(const ArgumentStore &other)
+{
+       if(&other.info!=&info)
+               throw invalid_argument("ArgumentStore::operator=");
+
+       destroy();
+       copy_from(other.store);
+
+       return *this;
+}
+
 ArgumentStore::~ArgumentStore()
+{
+       destroy();
+}
+
+void ArgumentStore::destroy()
 {
        for(unsigned i=0; i<info.key.signature.size(); ++i)
                switch(info.key.signature[i])
@@ -31,6 +57,25 @@ ArgumentStore::~ArgumentStore()
                        reinterpret_cast<SymbolType::Store *>(store+info.arg_offsets[i])->~Symbol();
                        break;
                }
+
+       delete[] store;
+}
+
+void ArgumentStore::copy_from(const char *other)
+{
+       for(unsigned i=0; i<info.key.signature.size(); ++i)
+               switch(info.key.signature[i])
+               {
+               case StringType::signature:
+                       new(store+info.arg_offsets[i]) StringType::Store(*reinterpret_cast<const StringType::Store *>(other+info.arg_offsets[i]));
+                       break;
+               case SymbolType::signature:
+                       new(store+info.arg_offsets[i]) SymbolType::Store(*reinterpret_cast<const SymbolType::Store *>(other+info.arg_offsets[i]));
+                       break;
+               default:
+                       copy(other+info.arg_offsets[i], other+(i+1<info.arg_offsets.size() ? info.arg_offsets[i+1] : info.args_size), store+info.arg_offsets[i]);
+                       break;
+               }
 }
 
 } // namespace DataFile