aboutsummaryrefslogtreecommitdiff
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
parentcd804ef787b1225f3bc59f845bbe66c98b5c1013 (diff)
Prevent nested class/typedef traversal
-rw-r--r--odb/common.hxx70
-rw-r--r--odb/mysql/header.cxx2
-rw-r--r--odb/mysql/inline.cxx2
-rw-r--r--odb/mysql/source.cxx2
-rw-r--r--odb/tracer/header.cxx2
-rw-r--r--odb/tracer/inline.cxx2
-rw-r--r--odb/tracer/source.cxx2
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 ());