From a482f1c4dd4efab83d3b19309900f1cbf54383a5 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Tue, 15 Oct 2013 07:01:17 +0200 Subject: Automatically map C++11 enum classes (strong enums) --- odb/relational/mssql/context.cxx | 9 +----- odb/relational/mysql/context.cxx | 59 ++++++++++++++++++--------------------- odb/relational/oracle/context.cxx | 9 +----- odb/relational/pgsql/context.cxx | 9 +----- odb/relational/sqlite/context.cxx | 9 +----- 5 files changed, 31 insertions(+), 64 deletions(-) (limited to 'odb/relational') diff --git a/odb/relational/mssql/context.cxx b/odb/relational/mssql/context.cxx index 1df235d..a0037eb 100644 --- a/odb/relational/mssql/context.cxx +++ b/odb/relational/mssql/context.cxx @@ -156,18 +156,11 @@ namespace relational if (!r.empty ()) return r; - using semantics::enum_; using semantics::array; - // Enum mapping. - // - if (t.is_a ()) - { - r = "INT"; - } // char[N] mapping. // - else if (array* a = dynamic_cast (&t)) + if (array* a = dynamic_cast (&t)) { semantics::type& bt (a->base_type ()); bool c (bt.is_a ()); diff --git a/odb/relational/mysql/context.cxx b/odb/relational/mysql/context.cxx index 75b71e9..55dd4f7 100644 --- a/odb/relational/mysql/context.cxx +++ b/odb/relational/mysql/context.cxx @@ -286,15 +286,12 @@ namespace relational bool id, bool* null) { - string r (base_context::database_type_impl (t, hint, id, null)); - - if (!r.empty ()) - return r; - using semantics::enum_; using semantics::enumerator; using semantics::array; + string r; + // Enum mapping. // if (enum_* e = dynamic_cast (&t)) @@ -302,43 +299,41 @@ namespace relational // We can only map to ENUM if the C++ enumeration is contiguous // and starts with 0. // - if (e->unsigned_ ()) + enum_::enumerates_iterator i (e->enumerates_begin ()), + end (e->enumerates_end ()); + + if (i != end) { - enum_::enumerates_iterator i (e->enumerates_begin ()), - end (e->enumerates_end ()); + r += "ENUM("; - if (i != end) + for (unsigned long long j (0); i != end; ++i, ++j) { - r += "ENUM("; - - for (unsigned long long j (0); i != end; ++i, ++j) - { - enumerator const& er (i->enumerator ()); + enumerator const& er (i->enumerator ()); - if (er.value () != j) - break; - - if (j != 0) - r += ", "; + if (er.value () != j) + break; - r += quote_string (er.name ()); - } + if (j != 0) + r += ", "; - if (i == end) - r += ")"; - else - r.clear (); + r += quote_string (er.name ()); } - } - - if (r.empty ()) - { - r = "INT"; - if (e->unsigned_ ()) - r += " UNSIGNED"; + if (i == end) + r += ")"; + else + r.clear (); } + + if (!r.empty ()) + return r; } + + r = base_context::database_type_impl (t, hint, id, null); + + if (!r.empty ()) + return r; + // char[N] mapping. // else if (array* a = dynamic_cast (&t)) diff --git a/odb/relational/oracle/context.cxx b/odb/relational/oracle/context.cxx index f885564..98cda52 100644 --- a/odb/relational/oracle/context.cxx +++ b/odb/relational/oracle/context.cxx @@ -152,18 +152,11 @@ namespace relational if (!r.empty ()) return r; - using semantics::enum_; using semantics::array; - // Enum mapping. - // - if (t.is_a ()) - { - r = "NUMBER(10)"; - } // char[N] mapping. // - else if (array* a = dynamic_cast (&t)) + if (array* a = dynamic_cast (&t)) { semantics::type& bt (a->base_type ()); if (bt.is_a ()) diff --git a/odb/relational/pgsql/context.cxx b/odb/relational/pgsql/context.cxx index 947c6bd..d09fa2c 100644 --- a/odb/relational/pgsql/context.cxx +++ b/odb/relational/pgsql/context.cxx @@ -252,18 +252,11 @@ namespace relational if (!r.empty ()) return r; - using semantics::enum_; using semantics::array; - // Enum mapping. - // - if (t.is_a ()) - { - r = "INTEGER"; - } // char[N] mapping. // - else if (array* a = dynamic_cast (&t)) + if (array* a = dynamic_cast (&t)) { semantics::type& bt (a->base_type ()); if (bt.is_a ()) diff --git a/odb/relational/sqlite/context.cxx b/odb/relational/sqlite/context.cxx index 664af35..f347d30 100644 --- a/odb/relational/sqlite/context.cxx +++ b/odb/relational/sqlite/context.cxx @@ -242,18 +242,11 @@ namespace relational if (!r.empty ()) return r; - using semantics::enum_; using semantics::array; - // Enum mapping. - // - if (t.is_a ()) - { - r = "INTEGER"; - } // char[N] mapping. // - else if (array* a = dynamic_cast (&t)) + if (array* a = dynamic_cast (&t)) { semantics::type& bt (a->base_type ()); if (bt.is_a () || -- cgit v1.1