+////////////////////////////////////////////////////////////////////////////////\r
+\r
+// Author: Andy Rushton\r
+// Copyright: (c) Southampton University 1999-2004\r
+// (c) Andy Rushton 2004-2009\r
+// License: BSD License, see ../docs/license.html\r
+\r
+////////////////////////////////////////////////////////////////////////////////\r
+#include "persistent_float.hpp"\r
+\r
+////////////////////////////////////////////////////////////////////////////////\r
+// Macro for mapping either endian data onto little-endian addressing to make\r
+// my life easier in writing this code! I think better in little-endian mode\r
+// so the macro does nothing in that mode but maps little-endian onto\r
+// big-endian addressing in big-endian mode\r
+// TODO - make this compile-time configurable\r
+\r
+#define INDEX(index) ((context.little_endian()) ? (index) : ((bytes) - (index) - 1))\r
+\r
+/////////////////////////////////////////////////////////////////////\r
+// floating point types\r
+// format: {size}{byte}*size\r
+// ordering is msB first\r
+\r
+// this uses a similar mechanism to integer dumps. However, it is not clear how\r
+// the big-endian and little-endian argument applies to multi-word data so\r
+// this may need reworking by splitting into words and then bytes.\r
+\r
+namespace stlplus\r
+{\r
+\r
+ static void dump_float(stlplus::dump_context& context, unsigned bytes, unsigned char* data)\r
+ throw(stlplus::persistent_dump_failed)\r
+ {\r
+ unsigned i = bytes;\r
+ // put the size\r
+ context.put((unsigned char)i);\r
+ // and put the bytes\r
+ while(i--)\r
+ context.put(data[INDEX(i)]);\r
+ }\r
+\r
+ static void restore_float(stlplus::restore_context& context, unsigned bytes, unsigned char* data)\r
+ throw(stlplus::persistent_restore_failed)\r
+ {\r
+ // get the dumped size from the file\r
+ unsigned dumped_bytes = (unsigned)context.get();\r
+ // get the bytes from the file\r
+ unsigned i = dumped_bytes;\r
+ while(i--)\r
+ {\r
+ int ch = context.get();\r
+ if (i < bytes)\r
+ data[INDEX(i)] = (unsigned char)ch;\r
+ }\r
+ // however, if the dumped size was different I don't know how to map the formats, so give an error\r
+ if (dumped_bytes != bytes)\r
+ throw stlplus::persistent_restore_failed(std::string("size mismatch"));\r
+ }\r
+\r
+} // end namespace stlplus\r
+\r
+ ////////////////////////////////////////////////////////////////////////////////\r
+ // exported functions which simply call the low-level byte-dump and byte-restore routines above\r
+\r
+void stlplus::dump_float(stlplus::dump_context& context, const float& data) throw(stlplus::persistent_dump_failed)\r
+{\r
+ stlplus::dump_float(context, sizeof(float), (unsigned char*)&data);\r
+}\r
+\r
+void stlplus::restore_float(restore_context& context, float& data) throw(stlplus::persistent_restore_failed)\r
+{\r
+ stlplus::restore_float(context, sizeof(float), (unsigned char*)&data);\r
+}\r
+\r
+void stlplus::dump_double(stlplus::dump_context& context, const double& data) throw(stlplus::persistent_dump_failed)\r
+{\r
+ stlplus::dump_float(context, sizeof(double), (unsigned char*)&data);\r
+}\r
+\r
+void stlplus::restore_double(restore_context& context, double& data) throw(stlplus::persistent_restore_failed)\r
+{\r
+ stlplus::restore_float(context, sizeof(double), (unsigned char*)&data);\r
+}\r
+\r
+////////////////////////////////////////////////////////////////////////////////\r