diff options
Diffstat (limited to 'examples/cxx/serializer/polymorphism/supermen-simpl-mixin.cxx')
-rw-r--r-- | examples/cxx/serializer/polymorphism/supermen-simpl-mixin.cxx | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/examples/cxx/serializer/polymorphism/supermen-simpl-mixin.cxx b/examples/cxx/serializer/polymorphism/supermen-simpl-mixin.cxx new file mode 100644 index 0000000..328cc2f --- /dev/null +++ b/examples/cxx/serializer/polymorphism/supermen-simpl-mixin.cxx @@ -0,0 +1,83 @@ +// file : examples/cxx/serializer/polymorphism/supermen-simpl-mixin.cxx +// author : Boris Kolpackov <boris@codesynthesis.com> +// copyright : not copyrighted - public domain + +#include "supermen-simpl-mixin.hxx" + +// +// +void person_simpl:: +pre (const person& p) +{ + person_ = &p; +} + +std::string person_simpl:: +name () +{ + return person_->name (); +} + +// +// +bool superman_simpl:: +can_fly () +{ + return static_cast<const superman*> (person_)->can_fly (); +} + +// +// +unsigned int batman_simpl:: +wing_span () +{ + return static_cast<const batman*> (person_)->wing_span (); +} + +// +// +void supermen_simpl:: +pre (const supermen& s) +{ + supermen_ = &s; + i_ = s.begin (); +} + +bool supermen_simpl:: +person_next () +{ + return i_ != supermen_->end (); +} + +const person& supermen_simpl:: +person () +{ + const ::person& p = **i_++; + + // Map type id to serializer type. We could have also done this in a + // custom serializer_map implementation in which case we could simply + // pass a pointer to the person instance as type id. + // + xml_schema::serializer_context& ctx = _context (); + + switch (p.type ()) + { + case person_type: + { + ctx.type_id (person_sskel::_static_type ()); + break; + } + case superman_type: + { + ctx.type_id (superman_sskel::_static_type ()); + break; + } + case batman_type: + { + ctx.type_id (batman_sskel::_static_type ()); + break; + } + } + + return p; +} |