diff options
author | Karen Arutyunov <karen@codesynthesis.com> | 2019-07-25 22:24:19 +0300 |
---|---|---|
committer | Karen Arutyunov <karen@codesynthesis.com> | 2019-08-01 16:47:26 +0300 |
commit | 2c1fe0aa7b967a68e65465962182cc6551a6c51f (patch) | |
tree | 2cca1012b9f62e08da031a4717beab5c50976a76 | |
parent | 884f621be44e13b8df6a036b7542c789dd0caecb (diff) |
Add ODB container traits for small_vector
-rw-r--r-- | libbutl/small-vector-odb.hxx | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/libbutl/small-vector-odb.hxx b/libbutl/small-vector-odb.hxx new file mode 100644 index 0000000..4273e61 --- /dev/null +++ b/libbutl/small-vector-odb.hxx @@ -0,0 +1,67 @@ +// file : libbutl/small-vector-odb.hxx -*- C++ -*- +// copyright : Copyright (c) 2014-2019 Code Synthesis Ltd +// license : MIT; see accompanying LICENSE file + +#pragma once + +#include <odb/pre.hxx> + +#include <libbutl/small-vector.mxx> + +#include <odb/container-traits.hxx> + +namespace odb +{ + template <typename V, std::size_t N> + class access::container_traits<butl::small_vector<V, N>> + { + public: + static const container_kind kind = ck_ordered; + static const bool smart = false; + + using container_type = butl::small_vector<V, N>; + + using value_type = V; + using index_type = typename container_type::size_type; + + using functions = ordered_functions<index_type, value_type>; + + 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; + c.push_back (value_type ()); + more = f.select (dummy, c.back ()); + } + } + + 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> |