--- /dev/null
+////////////////////////////////////////////////////////////////////////////////\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_int.hpp"\r
+\r
+namespace stlplus\r
+{\r
+\r
+ ////////////////////////////////////////////////////////////////////////////////\r
+ // format: data msB first, packed into bytes with lowest index at the byte's lsb\r
+\r
+ // Note: the interface does not provide access to the internal storage and yet\r
+ // to be efficient the std::bitset must be packed as bytes. Thus I have to do it the\r
+ // hard way.\r
+\r
+ template<size_t N>\r
+ void dump_bitset(dump_context& context, const std::bitset<N>& data)\r
+ throw(persistent_dump_failed)\r
+ {\r
+ size_t bits = data.size();\r
+ size_t bytes = (bits+7)/8;\r
+ for (size_t B = bytes; B--; )\r
+ {\r
+ unsigned char ch = 0;\r
+ for (size_t b = 0; b < 8; b++)\r
+ {\r
+ size_t bit = B*8+b;\r
+ if (bit < bits && data.test(bit))\r
+ ch |= (0x01 << b);\r
+ }\r
+ dump_unsigned_char(context,ch);\r
+ }\r
+ }\r
+\r
+ template<size_t N>\r
+ void restore_bitset(restore_context& context, std::bitset<N>& data)\r
+ throw(persistent_restore_failed)\r
+ {\r
+ size_t bits = data.size();\r
+ size_t bytes = (bits+7)/8;\r
+ for (size_t B = bytes; B--; )\r
+ {\r
+ unsigned char ch = 0;\r
+ restore_unsigned_char(context,ch);\r
+ for (size_t b = 0; b < 8; b++)\r
+ {\r
+ size_t bit = B*8+b;\r
+ if (bit >= bits) break;\r
+ data.set(bit, ch & (0x01 << b) ? true : false);\r
+ }\r
+ }\r
+ }\r
+\r
+ ////////////////////////////////////////////////////////////////////////////////\r
+\r
+} // end namespace stlplus\r