aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2015-07-02 11:46:06 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2015-07-02 11:46:06 +0200
commit146cd9dc8796944391b919e7add8da9463eea20a (patch)
tree9e228240a9ca1b5fc03ee59d7c0aa66980e8b027
parentee4d942916d347ac65f53969941b0fb100760611 (diff)
Specialize container traits for std::vector<bool>as
Since we cannot access elements directly.
-rw-r--r--odb/std-vector-traits.hxx54
1 files changed, 54 insertions, 0 deletions
diff --git a/odb/std-vector-traits.hxx b/odb/std-vector-traits.hxx
index e967b09..4c83497 100644
--- a/odb/std-vector-traits.hxx
+++ b/odb/std-vector-traits.hxx
@@ -63,6 +63,60 @@ namespace odb
f.delete_ ();
}
};
+
+ // std::vector<bool> is special.
+ //
+ template <typename A>
+ class access::container_traits<std::vector<bool, A> >
+ {
+ public:
+ static const container_kind kind = ck_ordered;
+ static const bool smart = false;
+
+ typedef std::vector<bool, A> container_type;
+
+ typedef bool value_type;
+ typedef typename container_type::size_type index_type;
+
+ typedef ordered_functions<index_type, value_type> functions;
+
+ public:
+ static void
+ persist (const container_type& c, const functions& f)
+ {
+ for (index_type i (0), n (c.size ()); i < n; ++i)
+ f.insert (i, c[i]);
+ }
+
+ static void
+ load (container_type& c, bool more, const functions& f)
+ {
+ c.clear ();
+
+ while (more)
+ {
+ index_type dummy;
+ value_type value;
+ more = f.select (dummy, value);
+ c.push_back (value);
+ }
+ }
+
+ static void
+ update (const container_type& c, const functions& f)
+ {
+ f.delete_ ();
+
+ for (index_type i (0), n (c.size ()); i < n; ++i)
+ f.insert (i, c[i]);
+ }
+
+ static void
+ erase (const functions& f)
+ {
+ f.delete_ ();
+ }
+ };
}
#include <odb/post.hxx>