diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2013-02-05 15:50:08 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2013-02-05 15:50:08 +0200 |
commit | 43fa55c1b8e389838c83be933bb30a2caaf7468d (patch) | |
tree | 310bc0ecc43ea38276a7e8ff2a541f2cba395333 /common/container/test.hxx | |
parent | 3eee63801cbe833f6557d6f85c5778b6209140be (diff) |
Add support for change-tracking containers
ODB now supports "smart" ordered containers. Such containers get extra
functions for updating and deleting individual elements. Based on this
functionality implement two change-tracking containers: odb::vector
(equivalent to std::vector) and QOdbList (equivalent to QList). New
tests: common/container/change-tracking and qt/common/container/change-
tracking.
Diffstat (limited to 'common/container/test.hxx')
-rw-r--r-- | common/container/test.hxx | 268 |
1 files changed, 0 insertions, 268 deletions
diff --git a/common/container/test.hxx b/common/container/test.hxx deleted file mode 100644 index c531efb..0000000 --- a/common/container/test.hxx +++ /dev/null @@ -1,268 +0,0 @@ -// file : common/container/test.hxx -// copyright : Copyright (c) 2009-2012 Code Synthesis Tools CC -// license : GNU GPL v2; see accompanying LICENSE file - -#ifndef TEST_HXX -#define TEST_HXX - -#include <common/config.hxx> // HAVE_CXX11 - -#include <map> -#include <set> -#include <list> -#include <vector> -#include <string> - -#ifdef HAVE_CXX11 -# include <array> -# include <forward_list> -# include <unordered_map> -# include <unordered_set> -#endif - -#include <odb/core.hxx> - -#pragma db value -struct comp -{ - comp () {} - comp (int n, const std::string& s) : num (n), str (s) {} - - #pragma db column("number") - int num; - std::string str; -}; - -inline bool -operator== (const comp& x, const comp& y) -{ - return x.num == y.num && x.str == y.str; -} - -inline bool -operator!= (const comp& x, const comp& y) -{ - return !(x == y); -} - -inline bool -operator< (const comp& x, const comp& y) -{ - return x.num != y.num ? x.num < y.num : x.str < y.str; -} - -typedef std::list<std::string> str_list; - -typedef std::vector<int> num_vector; -typedef std::vector<std::string> str_vector; - -typedef std::set<int> num_set; -typedef std::set<std::string> str_set; -typedef std::set<comp> comp_set; - -typedef std::map<int, std::string> num_str_map; -typedef std::map<std::string, int> str_num_map; -typedef std::map<int, comp> num_comp_map; -typedef std::map<comp, std::string> comp_str_map; - -#ifdef HAVE_CXX11 -struct comp_hash -{ - std::size_t - operator() (comp const& x) const {return nh (x.num) + sh (x.str);} - - std::hash<int> nh; - std::hash<std::string> sh; -}; - -typedef std::array<int, 3> num_array; -typedef std::array<std::string, 3> str_array; -typedef std::array<comp, 3> comp_array; - -typedef std::forward_list<int> num_flist; -typedef std::forward_list<std::string> str_flist; -typedef std::forward_list<comp> comp_flist; - -typedef std::unordered_set<int> num_uset; -typedef std::unordered_set<std::string> str_uset; -typedef std::unordered_set<comp, comp_hash> comp_uset; - -typedef std::unordered_map<int, std::string> num_str_umap; -typedef std::unordered_map<std::string, int> str_num_umap; -typedef std::unordered_map<int, comp> num_comp_umap; -typedef std::unordered_map<comp, std::string, comp_hash> comp_str_umap; -#endif - -#pragma db value -struct cont_comp1 -{ - // This composite value does not have any columns. - // - num_vector sv; // Have the name "conflic" with the one in the object. -}; - -#pragma db value -struct cont_comp2 -{ - cont_comp2 (): num (777), str ("ggg") {} - - int num; - str_list sl; - std::string str; -}; - -#pragma db object -struct object -{ - object (): nv (comp1_.sv), sl (comp2_.sl) {} - object (const std::string& id) : id_ (id), nv (comp1_.sv), sl (comp2_.sl) {} - - #pragma db id - std::string id_; - - int num; - - cont_comp1 comp1_; - cont_comp2 comp2_; - - // vector - // - #pragma db transient - num_vector& nv; - - #pragma db table("object_strings") id_column ("obj_id") - str_vector sv; - - #pragma db value_column("") - std::vector<comp> cv; - - #pragma db unordered - num_vector uv; - - // list - // - #pragma db transient - str_list& sl; - - // set - // - num_set ns; - str_set ss; - comp_set cs; - - // map - // - num_str_map nsm; - str_num_map snm; - num_comp_map ncm; - comp_str_map csm; - -#ifdef HAVE_CXX11 - // array - // - num_array na; - str_array sa; - comp_array ca; - - // forward_list - // - num_flist nfl; - str_flist sfl; - comp_flist cfl; - - // unordered_set - // - num_uset nus; - str_uset sus; - comp_uset cus; - - // unordered_map - // - num_str_umap nsum; - str_num_umap snum; - num_comp_umap ncum; - comp_str_umap csum; -#else - // Dummy containers to get the equivalent DROP TABLE statements. - // - num_vector na; - num_vector sa; - num_vector ca; - - num_vector nfl; - num_vector sfl; - num_vector cfl; - - num_set nus; - str_set sus; - comp_set cus; - - num_str_map nsum; - str_num_map snum; - num_comp_map ncum; - comp_str_map csum; -#endif - - std::string str; -}; - -inline bool -operator== (const object& x, const object& y) -{ - if (x.uv.size () != y.uv.size ()) - return false; - - int xs (0), ys (0); - - for (num_vector::size_type i (0); i < x.uv.size (); ++i) - { - xs += x.uv[i]; - ys += y.uv[i]; - } - - return - x.id_ == y.id_ && - x.num == y.num && - - x.comp2_.num == y.comp2_.num && - x.comp2_.str == y.comp2_.str && - - x.nv == y.nv && - x.sv == y.sv && - x.cv == y.cv && - xs == ys && - - x.sl == y.sl && - - x.ns == y.ns && - x.ss == y.ss && - x.cs == y.cs && - - x.nsm == y.nsm && - x.snm == y.snm && - x.ncm == y.ncm && - x.csm == y.csm && - -#ifdef HAVE_CXX11 - x.na == y.na && - x.sa == y.sa && - x.ca == y.ca && - - x.nfl == y.nfl && - x.sfl == y.sfl && - x.cfl == y.cfl && - - x.nus == y.nus && - x.sus == y.sus && - x.cus == y.cus && - - x.nsum == y.nsum && - x.snum == y.snum && - x.ncum == y.ncum && - x.csum == y.csum && -#endif - - x.str == y.str; -} - -#endif // TEST_HXX |