aboutsummaryrefslogtreecommitdiff
path: root/odb/validator.cxx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2013-09-17 11:11:43 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2013-09-17 11:11:43 +0200
commit791b94b894f93bc037637907616efc844f3d9414 (patch)
tree27b8d92cbe5f7918109842d36484fb4b639a020c /odb/validator.cxx
parent565ad74e164abdaaa31de146a1ef76f3d3f6734d (diff)
Add support for defining composite values inside persistent classes, etc
Diffstat (limited to 'odb/validator.cxx')
-rw-r--r--odb/validator.cxx119
1 files changed, 72 insertions, 47 deletions
diff --git a/odb/validator.cxx b/odb/validator.cxx
index 2de8882..172ca6d 100644
--- a/odb/validator.cxx
+++ b/odb/validator.cxx
@@ -396,8 +396,6 @@ namespace
//
struct value_type: traversal::type, context
{
- value_type (bool& valid): valid_ (valid) {}
-
virtual void
traverse (semantics::type& t)
{
@@ -406,33 +404,62 @@ namespace
override_null (t);
override_null (t, "value");
}
+ };
- bool& valid_;
+ struct typedefs1: typedefs
+ {
+ typedefs1 (traversal::declares& d)
+ : typedefs (true), declares_ (d)
+ {
+ }
+
+ void
+ traverse (semantics::typedefs& t)
+ {
+ if (check (t))
+ traversal::typedefs::traverse (t);
+ else
+ declares_.traverse (t);
+ }
+
+ private:
+ traversal::declares& declares_;
};
//
//
struct class1: traversal::class_, context
{
- class1 (bool& valid, value_type& vt)
- : valid_ (valid), vt_ (vt), member_ (valid)
+ class1 (bool& valid)
+ : valid_ (valid), typedefs_ (declares_), member_ (valid)
{
- *this >> names_ >> member_;
+ *this >> defines_ >> *this;
+ *this >> typedefs_ >> *this;
+ *this >> declares_ >> vt_;
+
+ names_member_ >> member_;
}
virtual void
traverse (type& c)
{
- if (object (c))
+ switch (class_kind (c))
+ {
+ case class_object:
+ names (c);
traverse_object (c);
- else if (view (c))
+ break;
+ case class_view:
+ names (c);
traverse_view (c);
- else
- {
- if (composite (c))
- traverse_composite (c);
-
+ break;
+ case class_composite:
+ names (c);
+ traverse_composite (c);
+ // Fall through.
+ case class_other:
vt_.dispatch (c);
+ break;
}
}
@@ -574,7 +601,7 @@ namespace
// Check members.
//
- names (c);
+ names (c, names_member_);
// Check special members.
//
@@ -881,7 +908,7 @@ namespace
// Check members.
//
- names (c);
+ names (c, names_member_);
// Check id.
//
@@ -953,7 +980,7 @@ namespace
// Check members.
//
- names (c);
+ names (c, names_member_);
// Check id.
//
@@ -986,30 +1013,14 @@ namespace
}
bool& valid_;
- value_type& vt_;
-
- data_member1 member_;
- traversal::names names_;
- };
-
- struct typedefs1: typedefs
- {
- typedefs1 (traversal::declares& d)
- : typedefs (true), declares_ (d)
- {
- }
- void
- traverse (semantics::typedefs& t)
- {
- if (check (t))
- traversal::typedefs::traverse (t);
- else
- declares_.traverse (t);
- }
+ traversal::defines defines_;
+ traversal::declares declares_;
+ typedefs1 typedefs_;
- private:
- traversal::declares& declares_;
+ value_type vt_;
+ data_member1 member_;
+ traversal::names names_member_;
};
//
@@ -1180,7 +1191,7 @@ namespace
struct class2: traversal::class_, context
{
class2 (bool& valid)
- : valid_ (valid), has_lt_operator_ (0)
+ : valid_ (valid), has_lt_operator_ (0), typedefs_ (true)
{
// Find the has_lt_operator function template.
//
@@ -1218,17 +1229,28 @@ namespace
if (has_lt_operator_ == 0)
valid_ = false;
+
+ *this >> defines_ >> *this;
+ *this >> typedefs_ >> *this;
}
virtual void
traverse (type& c)
{
- if (object (c))
- traverse_object (c);
- else if (view (c))
- traverse_view (c);
- else if (composite (c))
- traverse_composite (c);
+ class_kind_type ck (class_kind (c));
+
+ if (ck == class_other)
+ return;
+
+ names (c);
+
+ switch (ck)
+ {
+ case class_object: traverse_object (c); break;
+ case class_view: traverse_view (c); break;
+ case class_composite: traverse_composite (c); break;
+ default: break;
+ }
// Check version dependencies.
//
@@ -1415,6 +1437,9 @@ namespace
bool& valid_;
tree has_lt_operator_;
+
+ traversal::defines defines_;
+ typedefs typedefs_;
};
}
@@ -1478,8 +1503,8 @@ validate (options const& ops,
traversal::declares unit_declares;
typedefs1 unit_typedefs (unit_declares);
traversal::namespace_ ns;
- value_type vt (valid);
- class1 c (valid, vt);
+ value_type vt;
+ class1 c (valid);
unit >> unit_defines >> ns;
unit_defines >> c;