aboutsummaryrefslogtreecommitdiff
path: root/odb/common.hxx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2010-08-19 13:47:18 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2010-08-19 13:47:18 +0200
commit7615f4dd87092aec82569bce68d75efcb82a90ae (patch)
tree5e64c96a12317be6ea381b512a7513203457273d /odb/common.hxx
parentcd804ef787b1225f3bc59f845bbe66c98b5c1013 (diff)
Prevent nested class/typedef traversal
Diffstat (limited to 'odb/common.hxx')
-rw-r--r--odb/common.hxx70
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