--- /dev/null
+#ifndef MSP_DATAFILE_ARGUMENTSTORE_H_
+#define MSP_DATAFILE_ARGUMENTSTORE_H_
+
+#include "statement.h"
+
+namespace Msp {
+namespace DataFile {
+
+class ArgumentStore
+{
+private:
+ const StatementInfo &info;
+ char *store;
+
+public:
+ ArgumentStore(const StatementInfo &);
+ ~ArgumentStore();
+
+ const StatementInfo &get_info() const { return info; }
+
+ template<typename T>
+ void set(unsigned i, const T &v)
+ {
+ *reinterpret_cast<typename TypeInfo<T>::Store *>(store+info.arg_offsets[i]) = v;
+ }
+
+ template<typename T>
+ typename TypeInfo<T>::Load get(unsigned i) const
+ {
+ return extract<typename TypeInfo<T>::Store>(store+info.arg_offsets[i], info.key.signature[i]);
+ }
+
+private:
+ template<typename T>
+ T extract(const char *, char) const;
+};
+
+template<typename T>
+inline T ArgumentStore::extract(const char *p, char) const
+{
+ return *reinterpret_cast<const T *>(p);
+}
+
+template<>
+inline FloatType::Store ArgumentStore::extract<FloatType::Store>(const char *p, char s) const
+{
+ if(s==IntType::signature)
+ return *reinterpret_cast<const IntType::Store *>(p);
+ else
+ return *reinterpret_cast<const FloatType::Store *>(p);
+}
+
+} // namespace DataFile
+} // namespace Msp
+
+#endif