]> git.tdb.fi Git - libs/datafile.git/blobdiff - source/argumentstore.cpp
More efficient way of loading binary files
[libs/datafile.git] / source / argumentstore.cpp
diff --git a/source/argumentstore.cpp b/source/argumentstore.cpp
new file mode 100644 (file)
index 0000000..49bdbad
--- /dev/null
@@ -0,0 +1,37 @@
+#include "argumentstore.h"
+
+namespace Msp {
+namespace DataFile {
+
+ArgumentStore::ArgumentStore(const StatementInfo &n):
+       info(n),
+       store(new char[info.args_size])
+{
+       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;
+                       break;
+               case SymbolType::signature:
+                       new(store+info.arg_offsets[i]) SymbolType::Store;
+                       break;
+               }
+}
+
+ArgumentStore::~ArgumentStore()
+{
+       for(unsigned i=0; i<info.key.signature.size(); ++i)
+               switch(info.key.signature[i])
+               {
+               case StringType::signature:
+                       reinterpret_cast<StringType::Store *>(store+info.arg_offsets[i])->~basic_string();
+                       break;
+               case SymbolType::signature:
+                       reinterpret_cast<SymbolType::Store *>(store+info.arg_offsets[i])->~Symbol();
+                       break;
+               }
+}
+
+} // namespace DataFile
+} // namespace Msp