diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2010-10-14 12:21:35 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2010-10-14 12:21:35 +0200 |
commit | b7197929af1cca15e490703ba3632ae52a348b60 (patch) | |
tree | e4ed9dc7cf2021d6ad398fade7fc8148ff982b16 /libxsde | |
parent | 6f395f9f769866a04f6949cb7ed14f93d90cf728 (diff) |
New mapping for anyType with support for polymorphism
Diffstat (limited to 'libxsde')
-rw-r--r-- | libxsde/xsde/cxx/hybrid/any-type-pimpl.cxx | 102 | ||||
-rw-r--r-- | libxsde/xsde/cxx/hybrid/any-type-pimpl.hxx | 48 | ||||
-rw-r--r-- | libxsde/xsde/cxx/hybrid/any-type-pskel.cxx | 104 | ||||
-rw-r--r-- | libxsde/xsde/cxx/hybrid/any-type-pskel.hxx | 84 | ||||
-rw-r--r-- | libxsde/xsde/cxx/hybrid/any-type-pskel.ixx | 29 | ||||
-rw-r--r-- | libxsde/xsde/cxx/hybrid/any-type-simpl.cxx | 20 | ||||
-rw-r--r-- | libxsde/xsde/cxx/hybrid/any-type-simpl.hxx | 32 | ||||
-rw-r--r-- | libxsde/xsde/cxx/hybrid/any-type-sskel.cxx | 29 | ||||
-rw-r--r-- | libxsde/xsde/cxx/hybrid/any-type-sskel.hxx | 66 | ||||
-rw-r--r-- | libxsde/xsde/cxx/hybrid/any-type-sskel.ixx | 27 | ||||
-rw-r--r-- | libxsde/xsde/cxx/hybrid/any-type.cxx | 151 | ||||
-rw-r--r-- | libxsde/xsde/cxx/hybrid/any-type.hxx | 56 | ||||
-rw-r--r-- | libxsde/xsde/makefile | 8 |
13 files changed, 749 insertions, 7 deletions
diff --git a/libxsde/xsde/cxx/hybrid/any-type-pimpl.cxx b/libxsde/xsde/cxx/hybrid/any-type-pimpl.cxx new file mode 100644 index 0000000..30ec8f6 --- /dev/null +++ b/libxsde/xsde/cxx/hybrid/any-type-pimpl.cxx @@ -0,0 +1,102 @@ +// file : xsde/cxx/hybrid/any-type-pimpl.cxx +// author : Boris Kolpackov <boris@codesynthesis.com> +// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// license : GNU GPL v2 + exceptions; see accompanying LICENSE file + +#include <xsde/cxx/config.hxx> + +#ifdef XSDE_CUSTOM_ALLOCATOR +# include <xsde/cxx/allocator.hxx> +#endif + +#include <xsde/cxx/hybrid/any-type-pimpl.hxx> + +namespace xsde +{ + namespace cxx + { + namespace hybrid + { + any_type_pimpl:: + ~any_type_pimpl () + { + if (!base_ && val_) + { +#ifndef XSDE_CUSTOM_ALLOCATOR + delete val_; +#else + val_->~any_type (); + cxx::free (val_); +#endif + } + } + + void any_type_pimpl:: + _reset () + { + any_type_pskel::_reset (); + + if (!base_ && val_) + { +#ifndef XSDE_CUSTOM_ALLOCATOR + delete val_; +#else + val_->~any_type (); + cxx::free (val_); +#endif + val_ = 0; + } + } + + any_type_pimpl:: + any_type_pimpl (bool base) + : base_ (base), val_ (0) + { + } + + void any_type_pimpl:: + pre_impl (any_type* qn) + { + val_ = qn; + } + + void any_type_pimpl:: + _pre () + { + if (val_ == 0) + { +#ifndef XSDE_CUSTOM_ALLOCATOR + val_ = new any_type (); +#else + val_ = static_cast<any_type*> (alloc (sizeof (any_type))); + +#ifdef XSDE_EXCEPTIONS + alloc_guard ag (val_); + new (val_) any_type (); + ag.release (); +#else + if (val_) + new (val_) any_type (); +#endif +#endif + +#ifndef XSDE_EXCEPTIONS + if (val_ == 0) + { + _sys_error (sys_error::no_memory); + return; + } +#endif + } + } + + any_type* any_type_pimpl:: + post_any_type () + { + any_type* r = val_; + val_ = 0; + return r; + } + } + } +} diff --git a/libxsde/xsde/cxx/hybrid/any-type-pimpl.hxx b/libxsde/xsde/cxx/hybrid/any-type-pimpl.hxx new file mode 100644 index 0000000..4e799a6 --- /dev/null +++ b/libxsde/xsde/cxx/hybrid/any-type-pimpl.hxx @@ -0,0 +1,48 @@ +// file : xsde/cxx/hybrid/any-type-pimpl.hxx +// author : Boris Kolpackov <boris@codesynthesis.com> +// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// license : GNU GPL v2 + exceptions; see accompanying LICENSE file + +#ifndef XSDE_CXX_HYBRID_ANY_TYPE_PIMPL_HXX +#define XSDE_CXX_HYBRID_ANY_TYPE_PIMPL_HXX + +#include <xsde/cxx/config.hxx> + +#include <xsde/cxx/hybrid/any-type-pskel.hxx> + +namespace xsde +{ + namespace cxx + { + namespace hybrid + { +#ifdef XSDE_REUSE_STYLE_MIXIN + struct any_type_pimpl: virtual any_type_pskel +#else + struct any_type_pimpl: any_type_pskel +#endif + { + ~any_type_pimpl (); + any_type_pimpl (bool base = false); + + void + pre_impl (any_type*); + + virtual void + _pre (); + + virtual any_type* + post_any_type (); + + virtual void + _reset (); + + protected: + bool base_; + any_type* val_; + }; + } + } +} + +#endif // XSDE_CXX_HYBRID_ANY_TYPE_PIMPL_HXX diff --git a/libxsde/xsde/cxx/hybrid/any-type-pskel.cxx b/libxsde/xsde/cxx/hybrid/any-type-pskel.cxx new file mode 100644 index 0000000..d8434b2 --- /dev/null +++ b/libxsde/xsde/cxx/hybrid/any-type-pskel.cxx @@ -0,0 +1,104 @@ +// file : xsde/cxx/hybrid/any-type-pskel.cxx +// author : Boris Kolpackov <boris@codesynthesis.com> +// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// license : GNU GPL v2 + exceptions; see accompanying LICENSE file + +#include <xsde/cxx/hybrid/any-type-pskel.hxx> + +namespace xsde +{ + namespace cxx + { + namespace hybrid + { +#ifdef XSDE_POLYMORPHIC + bool any_type_pskel:: + _start_element_impl (const ro_string& ns, + const ro_string& name, + const char* type) + { +#ifdef XSDE_PARSER_VALIDATION + parser::context& ctx = _context (); + ctx.current_.any_ = true; + ctx.current_.depth_++; + + _start_any_element (ns, name, type); + return true; +#else + return false; +#endif + } +#else + bool any_type_pskel:: + _start_element_impl (const ro_string& ns, const ro_string& name) + { +#ifdef XSDE_PARSER_VALIDATION + parser::context& ctx = _context (); + ctx.current_.any_ = true; + ctx.current_.depth_++; + + _start_any_element (ns, name); + return true; +#else + return false; +#endif + } +#endif + + bool any_type_pskel:: + _end_element_impl (const ro_string& ns, const ro_string& name) + { +#ifdef XSDE_PARSER_VALIDATION + _end_any_element (ns, name); + return true; +#else + return false; +#endif + } + +#ifdef XSDE_PARSER_VALIDATION + bool any_type_pskel:: + _attribute_impl_phase_two (const ro_string& ns, + const ro_string& name, + const ro_string& value) + { + _any_attribute (ns, name, value); + return true; + } +#else + bool any_type_pskel:: + _attribute_impl (const ro_string&, + const ro_string&, + const ro_string&) + { + return false; + } +#endif + + bool any_type_pskel:: + _characters_impl (const ro_string& s) + { +#ifdef XSDE_PARSER_VALIDATION + _any_characters (s); + return true; +#else + return false; +#endif + } + +#ifdef XSDE_POLYMORPHIC + const char* any_type_pskel:: + _static_type () + { + return "anyType http://www.w3.org/2001/XMLSchema"; + } + + const char* any_type_pskel:: + _dynamic_type () const + { + return _static_type (); + } +#endif + } + } +} diff --git a/libxsde/xsde/cxx/hybrid/any-type-pskel.hxx b/libxsde/xsde/cxx/hybrid/any-type-pskel.hxx new file mode 100644 index 0000000..6751120 --- /dev/null +++ b/libxsde/xsde/cxx/hybrid/any-type-pskel.hxx @@ -0,0 +1,84 @@ +// file : xsde/cxx/hybrid/any-type-pskel.hxx +// author : Boris Kolpackov <boris@codesynthesis.com> +// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// license : GNU GPL v2 + exceptions; see accompanying LICENSE file + +#ifndef XSDE_CXX_HYBRID_ANY_TYPE_PSKEL_HXX +#define XSDE_CXX_HYBRID_ANY_TYPE_PSKEL_HXX + +#include <xsde/cxx/config.hxx> + +#ifdef XSDE_PARSER_VALIDATION +# include <xsde/cxx/parser/validating/parser.hxx> +#else +# include <xsde/cxx/parser/non-validating/parser.hxx> +#endif + +#include <xsde/cxx/hybrid/any-type.hxx> + +namespace xsde +{ + namespace cxx + { + namespace hybrid + { +#ifdef XSDE_PARSER_VALIDATION + struct any_type_pskel: parser::validating::complex_content +#else + struct any_type_pskel: parser::non_validating::complex_content +#endif + { +#ifdef XSDE_POLYMORPHIC + virtual bool + _start_element_impl (const ro_string&, + const ro_string&, + const char*); +#else + virtual bool + _start_element_impl (const ro_string&, const ro_string&); +#endif + + virtual bool + _end_element_impl (const ro_string&, const ro_string&); + +#ifdef XSDE_PARSER_VALIDATION + virtual bool + _attribute_impl_phase_two (const ro_string&, + const ro_string&, + const ro_string&); +#else + virtual bool + _attribute_impl (const ro_string&, + const ro_string&, + const ro_string&); +#endif + + virtual bool + _characters_impl (const ro_string&); + + virtual any_type* + post_any_type () = 0; + +#ifdef XSDE_POLYMORPHIC + static const char* + _static_type (); + + virtual const char* + _dynamic_type () const; +#endif + +#ifdef XSDE_REUSE_STYLE_TIEIN + any_type_pskel (); + any_type_pskel (any_type_pskel* impl, void*); + + protected: + any_type_pskel* any_type_impl_; +#endif + }; + } + } +} + +#include <xsde/cxx/hybrid/any-type-pskel.ixx> + +#endif // XSDE_CXX_HYBRID_ANY_TYPE_PSKEL_HXX diff --git a/libxsde/xsde/cxx/hybrid/any-type-pskel.ixx b/libxsde/xsde/cxx/hybrid/any-type-pskel.ixx new file mode 100644 index 0000000..b63ec72 --- /dev/null +++ b/libxsde/xsde/cxx/hybrid/any-type-pskel.ixx @@ -0,0 +1,29 @@ +// file : xsde/cxx/hybrid/any-type-pskel.ixx +// author : Boris Kolpackov <boris@codesynthesis.com> +// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// license : GNU GPL v2 + exceptions; see accompanying LICENSE file + +namespace xsde +{ + namespace cxx + { + namespace hybrid + { + // any_type_pskel + // +#ifdef XSDE_REUSE_STYLE_TIEIN + inline any_type_pskel:: + any_type_pskel () + : any_type_impl_ (0) + { + } + + inline any_type_pskel:: + any_type_pskel (any_type_pskel* impl, void*) + : complex_content (impl, 0), any_type_impl_ (impl) + { + } +#endif + } + } +} diff --git a/libxsde/xsde/cxx/hybrid/any-type-simpl.cxx b/libxsde/xsde/cxx/hybrid/any-type-simpl.cxx new file mode 100644 index 0000000..fd65e92 --- /dev/null +++ b/libxsde/xsde/cxx/hybrid/any-type-simpl.cxx @@ -0,0 +1,20 @@ +// file : xsde/cxx/hybrid/any-type-simpl.cxx +// author : Boris Kolpackov <boris@codesynthesis.com> +// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// license : GNU GPL v2 + exceptions; see accompanying LICENSE file + +#include <xsde/cxx/hybrid/any-type-simpl.hxx> + +namespace xsde +{ + namespace cxx + { + namespace hybrid + { + void any_type_simpl:: + pre (const any_type&) + { + } + } + } +} diff --git a/libxsde/xsde/cxx/hybrid/any-type-simpl.hxx b/libxsde/xsde/cxx/hybrid/any-type-simpl.hxx new file mode 100644 index 0000000..a6ef220 --- /dev/null +++ b/libxsde/xsde/cxx/hybrid/any-type-simpl.hxx @@ -0,0 +1,32 @@ +// file : xsde/cxx/hybrid/any-type-simpl.hxx +// author : Boris Kolpackov <boris@codesynthesis.com> +// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// license : GNU GPL v2 + exceptions; see accompanying LICENSE file + +#ifndef XSDE_CXX_HYBRID_ANY_TYPE_SIMPL_HXX +#define XSDE_CXX_HYBRID_ANY_TYPE_SIMPL_HXX + +#include <xsde/cxx/config.hxx> + +#include <xsde/cxx/hybrid/any-type-sskel.hxx> + +namespace xsde +{ + namespace cxx + { + namespace hybrid + { +#ifdef XSDE_REUSE_STYLE_MIXIN + struct any_type_simpl: virtual any_type_sskel +#else + struct any_type_simpl: any_type_sskel +#endif + { + virtual void + pre (const any_type&); + }; + } + } +} + +#endif // XSDE_CXX_HYBRID_ANY_TYPE_SIMPL_HXX diff --git a/libxsde/xsde/cxx/hybrid/any-type-sskel.cxx b/libxsde/xsde/cxx/hybrid/any-type-sskel.cxx new file mode 100644 index 0000000..7c6c1c1 --- /dev/null +++ b/libxsde/xsde/cxx/hybrid/any-type-sskel.cxx @@ -0,0 +1,29 @@ +// file : xsde/cxx/hybrid/any-type-sskel.cxx +// author : Boris Kolpackov <boris@codesynthesis.com> +// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// license : GNU GPL v2 + exceptions; see accompanying LICENSE file + +#include <xsde/cxx/hybrid/any-type-sskel.hxx> + +namespace xsde +{ + namespace cxx + { + namespace hybrid + { +#ifdef XSDE_POLYMORPHIC + const char* any_type_sskel:: + _static_type () + { + return "anyType http://www.w3.org/2001/XMLSchema"; + } + + const char* any_type_sskel:: + _dynamic_type () const + { + return _static_type (); + } +#endif + } + } +} diff --git a/libxsde/xsde/cxx/hybrid/any-type-sskel.hxx b/libxsde/xsde/cxx/hybrid/any-type-sskel.hxx new file mode 100644 index 0000000..29663be --- /dev/null +++ b/libxsde/xsde/cxx/hybrid/any-type-sskel.hxx @@ -0,0 +1,66 @@ +// file : xsde/cxx/hybrid/any-type-sskel.hxx +// author : Boris Kolpackov <boris@codesynthesis.com> +// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// license : GNU GPL v2 + exceptions; see accompanying LICENSE file + +#ifndef XSDE_CXX_HYBRID_ANY_TYPE_SSKEL_HXX +#define XSDE_CXX_HYBRID_ANY_TYPE_SSKEL_HXX + +#include <xsde/cxx/config.hxx> + +#ifdef XSDE_SERIALIZER_VALIDATION +# include <xsde/cxx/serializer/validating/serializer.hxx> +#else +# include <xsde/cxx/serializer/non-validating/serializer.hxx> +#endif + +#include <xsde/cxx/hybrid/any-type.hxx> + +namespace xsde +{ + namespace cxx + { + namespace hybrid + { +#ifdef XSDE_SERIALIZER_VALIDATION + struct any_type_sskel: serializer::validating::complex_content +#else + struct any_type_sskel: serializer::non_validating::complex_content +#endif + { + virtual void + pre (const any_type&) = 0; + + // Override the following two functions to implement + // your logic. + // + + // virtual void + // _serialize_attributes (); + + // virtual void + // _serialize_content (); + +#ifdef XSDE_POLYMORPHIC + static const char* + _static_type (); + + virtual const char* + _dynamic_type () const; +#endif + +#ifdef XSDE_REUSE_STYLE_TIEIN + any_type_sskel (); + any_type_sskel (any_type_sskel* impl, void*); + + protected: + any_type_sskel* any_type_impl_; +#endif + }; + } + } +} + +#include <xsde/cxx/hybrid/any-type-sskel.ixx> + +#endif // XSDE_CXX_HYBRID_ANY_TYPE_SSKEL_HXX diff --git a/libxsde/xsde/cxx/hybrid/any-type-sskel.ixx b/libxsde/xsde/cxx/hybrid/any-type-sskel.ixx new file mode 100644 index 0000000..341a340 --- /dev/null +++ b/libxsde/xsde/cxx/hybrid/any-type-sskel.ixx @@ -0,0 +1,27 @@ +// file : xsde/cxx/hybrid/any-type-sskel.ixx +// author : Boris Kolpackov <boris@codesynthesis.com> +// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// license : GNU GPL v2 + exceptions; see accompanying LICENSE file + +namespace xsde +{ + namespace cxx + { + namespace hybrid + { +#ifdef XSDE_REUSE_STYLE_TIEIN + inline any_type_sskel:: + any_type_sskel () + : any_type_impl_ (0) + { + } + + inline any_type_sskel:: + any_type_sskel (any_type_sskel* impl, void*) + : complex_content (impl, 0), any_type_impl_ (impl) + { + } +#endif + } + } +} diff --git a/libxsde/xsde/cxx/hybrid/any-type.cxx b/libxsde/xsde/cxx/hybrid/any-type.cxx index d4f257d..544e11b 100644 --- a/libxsde/xsde/cxx/hybrid/any-type.cxx +++ b/libxsde/xsde/cxx/hybrid/any-type.cxx @@ -3,6 +3,12 @@ // copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC // license : GNU GPL v2 + exceptions; see accompanying LICENSE file +#include <xsde/cxx/config.hxx> + +#ifdef XSDE_CUSTOM_ALLOCATOR +# include <xsde/cxx/allocator.hxx> +#endif + #include <xsde/cxx/hybrid/any-type.hxx> namespace xsde @@ -13,12 +19,155 @@ namespace xsde { // any_type // -#ifdef XSDE_POLYMORPHIC any_type:: ~any_type () { +#ifndef XSDE_CUSTOM_ALLOCATOR + delete data_; +#else + if (data_ != 0) + { + data_->~data_sequence (); + cxx::free (data_); + } +#endif + } + +#ifdef XSDE_EXCEPTIONS + void any_type:: + allocate_custom_data () + { + if (data_ != 0) + return; + +#ifndef XSDE_CUSTOM_ALLOCATOR + data_ = new data_sequence; +#else + // Default data_sequence c-tor cannot throw so we don't need a guard. + // + data_ = static_cast<data_sequence*> ( + cxx::alloc (sizeof (data_sequence))); + new (data_) data_sequence; +#endif } + void any_type:: + _copy (any_type& c) const + { + if (data_ != 0) + { + c.allocate_custom_data (); + data_->copy (c.custom_data ()); + } + } + + struct any_type_guard + { + any_type_guard (any_type* p) : p_ (p) {} + + ~any_type_guard () + { +#ifndef XSDE_CUSTOM_ALLOCATOR + delete p_; +#else + if (p_ != 0) + { + p_->~any_type (); + cxx::free (p_); + } +#endif + } + + void + release () { p_ = 0; } + + private: + any_type* p_; + }; + + any_type* any_type:: + _clone () const + { +#ifndef XSDE_CUSTOM_ALLOCATOR + any_type* c = new any_type; +#else + // Default any_type c-tor cannot throw so we don't need alloc_guard. + // + any_type* c = static_cast<any_type*> (cxx::alloc (sizeof (any_type))); + new (c) any_type; +#endif + any_type_guard g (c); + _copy (*c); + g.release (); + return c; + } +#else + bool any_type:: + allocate_custom_data () + { + if (data_ != 0) + return true; + +#ifndef XSDE_CUSTOM_ALLOCATOR + data_ = new data_sequence; +#else + data_ = static_cast<data_sequence*> ( + cxx::alloc (sizeof (data_sequence))); +#endif + if (data_ == 0) + return false; + +#ifdef XSDE_CUSTOM_ALLOCATOR + new (data_) data_sequence; +#endif + return true; + } + + bool + _copy (any_type&) const + { + if (data_ != 0) + { + if (!c.allocate_custom_data () || + !data_.copy (c.custom_data ())) + return false; + } + + return true; + } + + any_type* any_type:: + _clone () const + { +#ifndef XSDE_CUSTOM_ALLOCATOR + any_type* c = new any_type; +#else + any_type* c = static_cast<any_type*> (cxx::alloc (sizeof (any_type))); +#endif + + if (c == 0) + return 0; + +#ifdef XSDE_CUSTOM_ALLOCATOR + new (c) any_type; +#endif + + if (!_copy (*c)) + { +#ifndef XSDE_CUSTOM_ALLOCATOR + delete c; +#else + c->~any_type (); + cxx::free (c); +#endif + return 0; + } + + return c; + } +#endif + +#ifdef XSDE_POLYMORPHIC #ifdef XSDE_STL const std::string& any_type:: _dynamic_type () const diff --git a/libxsde/xsde/cxx/hybrid/any-type.hxx b/libxsde/xsde/cxx/hybrid/any-type.hxx index a356564..48b0e22 100644 --- a/libxsde/xsde/cxx/hybrid/any-type.hxx +++ b/libxsde/xsde/cxx/hybrid/any-type.hxx @@ -8,11 +8,11 @@ #include <xsde/cxx/config.hxx> -/* #ifdef XSDE_STL # include <string> #endif -*/ + +#include <xsde/cxx/hybrid/sequence.hxx> namespace xsde { @@ -22,11 +22,55 @@ namespace xsde { struct any_type { - /* -#ifdef XSDE_POLYMORPHIC + any_type () + : data_ (0) + { + } + + // Custom data. + // + typedef data_sequence custom_data_sequence; + typedef custom_data_sequence::iterator custom_data_iterator; + typedef custom_data_sequence::const_iterator custom_data_const_iterator; + +#ifndef XSDE_EXCEPTIONS + bool +#else + void +#endif + allocate_custom_data (); + + const custom_data_sequence& + custom_data () const + { + return *data_; + } + + custom_data_sequence& + custom_data () + { + return *data_; + } + +#ifndef XSDE_EXCEPTIONS + bool +#else + void +#endif + _copy (any_type&) const; + +#ifndef XSDE_POLYMORPHIC + ~any_type (); + + any_type* + _clone () const; +#else virtual ~any_type (); + virtual any_type* + _clone () const; + #ifdef XSDE_STL virtual const std::string& _dynamic_type () const; @@ -41,7 +85,9 @@ namespace xsde _static_type (); #endif #endif - */ + + private: + data_sequence* data_; }; } } diff --git a/libxsde/xsde/makefile b/libxsde/xsde/makefile index ce95980..0741d13 100644 --- a/libxsde/xsde/makefile +++ b/libxsde/xsde/makefile @@ -77,7 +77,13 @@ endif ## C++/Hybrid ## -cxx_tun += cxx/hybrid/sequence.cxx +cxx_tun += \ +cxx/hybrid/any-type.cxx \ +cxx/hybrid/any-type-pimpl.cxx \ +cxx/hybrid/any-type-pskel.cxx \ +cxx/hybrid/any-type-simpl.cxx \ +cxx/hybrid/any-type-sskel.cxx \ +cxx/hybrid/sequence.cxx ifeq ($(xsde_polymorphic),y) cxx_tun += \ |