From 7615f4dd87092aec82569bce68d75efcb82a90ae Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Thu, 19 Aug 2010 13:47:18 +0200 Subject: Prevent nested class/typedef traversal --- odb/common.hxx | 70 +++++++++++++++++++++++++++------------------------ odb/mysql/header.cxx | 2 -- odb/mysql/inline.cxx | 2 +- odb/mysql/source.cxx | 2 -- odb/tracer/header.cxx | 2 +- odb/tracer/inline.cxx | 2 +- odb/tracer/source.cxx | 2 +- 7 files changed, 41 insertions(+), 41 deletions(-) diff --git a/odb/common.hxx b/odb/common.hxx index ef188d8..e0fbbab 100644 --- a/odb/common.hxx +++ b/odb/common.hxx @@ -11,76 +11,80 @@ // Find id member. // -struct id_member: traversal::class_, - traversal::data_member, - context +struct id_member: traversal::class_ { - id_member (context& c) - : context (c) + id_member () { - *this >> names_ >> *this; + *this >> names_ >> member_; } semantics::data_member* member () const { - return m_; - } - - virtual void - traverse (semantics::data_member& m) - { - if (m.count ("id")) - m_ = &m; + return member_.m_; } virtual void traverse (semantics::class_& c) { - m_ = 0; + member_.m_ = 0; names (c); } private: + struct data_member: traversal::data_member + { + virtual void + traverse (semantics::data_member& m) + { + if (m.count ("id")) + m_ = &m; + } + + semantics::data_member* m_; + }; + + data_member member_; traversal::names names_; - semantics::data_member* m_; }; -// Find id member. +// Count persistent members. // -struct member_count: traversal::class_, - traversal::data_member, - context +struct member_count: traversal::class_ { - member_count (context& c) - : context (c) + member_count () { - *this >> names_ >> *this; + *this >> names_ >> member_; } std::size_t count () const { - return count_; - } - - virtual void - traverse (semantics::data_member& m) - { - if (!m.count ("transient")) - count_++; + return member_.count_; } virtual void traverse (semantics::class_& c) { - count_ = 0; + member_.count_ = 0; names (c); } private: + struct data_member: traversal::data_member + { + virtual void + traverse (semantics::data_member& m) + { + if (!m.count ("transient")) + count_++; + } + + std::size_t count_; + }; + + data_member member_; traversal::names names_; - std::size_t count_; }; #endif // ODB_COMMON_HXX diff --git a/odb/mysql/header.cxx b/odb/mysql/header.cxx index 8239d55..5e64c12 100644 --- a/odb/mysql/header.cxx +++ b/odb/mysql/header.cxx @@ -198,8 +198,6 @@ namespace mysql { class_ (context& c) : context (c), - id_member_ (c), - member_count_ (c), image_type_ (c), id_image_type_ (c), query_column_ (c) diff --git a/odb/mysql/inline.cxx b/odb/mysql/inline.cxx index 1bb5fef..4a1fffa 100644 --- a/odb/mysql/inline.cxx +++ b/odb/mysql/inline.cxx @@ -29,7 +29,7 @@ namespace mysql string const& type (c.fq_name ()); string traits ("access::object_traits< " + type + " >"); - id_member t (*this); + id_member t; t.traverse (c); semantics::data_member& id (*t.member ()); diff --git a/odb/mysql/source.cxx b/odb/mysql/source.cxx index 9d47541..9cf69b1 100644 --- a/odb/mysql/source.cxx +++ b/odb/mysql/source.cxx @@ -631,8 +631,6 @@ namespace mysql { class_ (context& c) : context (c), - id_member_ (c), - member_count_ (c), init_image_member_ (c, false), init_id_image_member_ (c, true), init_value_member_ (c) diff --git a/odb/tracer/header.cxx b/odb/tracer/header.cxx index 7efe5df..011ff9d 100644 --- a/odb/tracer/header.cxx +++ b/odb/tracer/header.cxx @@ -30,7 +30,7 @@ namespace tracer // Find the id member and type. // - id_member t (*this); + id_member t; t.traverse (c); if (t.member () == 0) diff --git a/odb/tracer/inline.cxx b/odb/tracer/inline.cxx index ef8cf15..10839a6 100644 --- a/odb/tracer/inline.cxx +++ b/odb/tracer/inline.cxx @@ -29,7 +29,7 @@ namespace tracer string const& type (c.fq_name ()); string traits ("access::object_traits< " + type + " >"); - id_member t (*this); + id_member t; t.traverse (c); semantics::data_member& id (*t.member ()); diff --git a/odb/tracer/source.cxx b/odb/tracer/source.cxx index 77dfa7a..0734099 100644 --- a/odb/tracer/source.cxx +++ b/odb/tracer/source.cxx @@ -29,7 +29,7 @@ namespace tracer string const& type (c.fq_name ()); string traits ("access::object_traits< " + type + " >"); - id_member t (*this); + id_member t; t.traverse (c); semantics::data_member& id (*t.member ()); -- cgit v1.1