diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2010-08-19 13:47:18 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2010-08-19 13:47:18 +0200 |
commit | 7615f4dd87092aec82569bce68d75efcb82a90ae (patch) | |
tree | 5e64c96a12317be6ea381b512a7513203457273d /odb/common.hxx | |
parent | cd804ef787b1225f3bc59f845bbe66c98b5c1013 (diff) |
Prevent nested class/typedef traversal
Diffstat (limited to 'odb/common.hxx')
-rw-r--r-- | odb/common.hxx | 70 |
1 files changed, 37 insertions, 33 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 |