diff options
| -rw-r--r-- | slicer/slicer/modelPartsTypes.h | 28 | ||||
| -rw-r--r-- | slicer/tool/parser.cpp | 50 | 
2 files changed, 39 insertions, 39 deletions
diff --git a/slicer/slicer/modelPartsTypes.h b/slicer/slicer/modelPartsTypes.h index bbb257b..02af753 100644 --- a/slicer/slicer/modelPartsTypes.h +++ b/slicer/slicer/modelPartsTypes.h @@ -112,16 +112,8 @@ namespace Slicer {  			};  			typedef IceUtil::Handle<HookBase> HookPtr; -			template <typename MT, typename CT, MT CT::*M> -			class DLL_PRIVATE HookMetadata : public HookBase { -				public: -					virtual const Metadata & GetMetadata() const override { return metadata; } - -					static const Metadata metadata; -			}; - -			template <typename MT, typename CT, MT CT::*M, typename MP, typename Base = HookMetadata<MT, CT, M>> -			class DLL_PRIVATE Hook : public Base { +			template <typename MT, typename CT, MT CT::*M, typename MP> +			class DLL_PRIVATE Hook : public HookBase {  				public:  					Hook(const std::string & n) :  						name(n) @@ -138,11 +130,25 @@ namespace Slicer {  						return name;  					} -  				private:  					const std::string name;  			}; +			template <typename MT, typename CT, MT CT::*M, typename MP> +			class DLL_PRIVATE HookMetadata : public Hook<MT, CT, M, MP> { +				public: +					HookMetadata(const std::string & n, const Metadata & md) : +						Hook<MT, CT, M, MP>(n), +						metadata(md) +					{ +					} + +					virtual const Metadata & GetMetadata() const override { return metadata; } + +					const Metadata metadata; +			}; + +  			virtual void OnEachChild(const ChildHandler & ch);  			virtual ChildRefPtr GetAnonChildRef(const HookFilter & flt) override; diff --git a/slicer/tool/parser.cpp b/slicer/tool/parser.cpp index d492632..e880d1c 100644 --- a/slicer/tool/parser.cpp +++ b/slicer/tool/parser.cpp @@ -213,6 +213,7 @@ namespace Slicer {  		fprintbf(cpp, "template<> DLL_PUBLIC\nconst Metadata ModelPartForComplex< %s >::metadata ",  				c->scoped());  		copyMetadata(c->getMetaData()); +		fprintbf(cpp, ";\n\n");  		defineMODELPART(stringbf("::IceInternal::Handle< %s >", c->scoped()), decl, c->getMetaData()); @@ -239,6 +240,7 @@ namespace Slicer {  		fprintbf(cpp, "template<> DLL_PUBLIC\nconst Metadata ModelPartForComplex< %s >::metadata ",  				c->scoped());  		copyMetadata(c->getMetaData()); +		fprintbf(cpp, ";\n\n");  		defineMODELPART(c->scoped(), c, c->getMetaData()); @@ -265,7 +267,13 @@ namespace Slicer {  			fprintbf(cpp, "\t\tnew ");  			auto type = dm->type();  			createNewModelPartPtrFor(it); -			fprintbf(cpp, "::Hook< %s", +			if (hasMetadata(dm->getMetaData())) { +				fprintbf(cpp, "::HookMetadata<"); +			} +			else { +				fprintbf(cpp, "::Hook<"); +			} +			fprintbf(cpp, " %s",  					Slice::typeToString(type, dm->optional()));  			fprintbf(cpp, ", %s, &%s, ",  					boost::algorithm::trim_right_copy_if(dm->container()->thisScope(), ispunct), @@ -277,33 +285,15 @@ namespace Slicer {  			if (dm->optional()) {  				fprintbf(cpp, " > ");  			} -			if (!hasMetadata(dm->getMetaData())) { -				fprintbf(cpp, ", HookBase"); -			} -			fprintbf(cpp, " >(\"%s\"),\n", +			fprintbf(cpp, " >(\"%s\"",  					name ? *name : dm->name()); -		} -		fprintbf(cpp, "\t};\n\n"); - -		for (const auto & dm : dataMembers) { -			if (!hasMetadata(dm->getMetaData())) { -				continue; -			} -			auto c = Slice::ContainedPtr::dynamicCast(dm->container()); -			auto t = Slice::TypePtr::dynamicCast(dm->container()); -			if (!t) { -				t = Slice::ClassDefPtr::dynamicCast(dm->container())->declaration(); +			if (hasMetadata(dm->getMetaData())) { +				fprintbf(cpp, ", "); +				copyMetadata(dm->getMetaData());  			} -			auto type = dm->type(); -			fprintbf(cpp, "template<>\ntemplate<> DLL_PRIVATE\nconst Metadata\n"); -			createNewModelPartPtrFor(it); -			fprintbf(cpp, "::HookMetadata< %s", -					Slice::typeToString(type, dm->optional())); -			fprintbf(cpp, ", %s, &%s >::metadata ", -					boost::algorithm::trim_right_copy_if(dm->container()->thisScope(), ispunct), -					dm->scoped()); -			copyMetadata(dm->getMetaData()); +			fprintbf(cpp, " ),\n");  		} +		fprintbf(cpp, "\t};\n\n");  	}  	void @@ -319,6 +309,7 @@ namespace Slicer {  		fprintbf(cpp, "template<> DLL_PUBLIC\nconst Metadata ModelPartForEnum< %s >::metadata ",  				e->scoped());  		copyMetadata(e->getMetaData()); +		fprintbf(cpp, ";\n\n");  		fprintbf(cpp, "template<> DLL_PUBLIC\nconst ModelPartForEnum< %s >::Enumerations\nModelPartForEnum< %s >::enumerations([]() -> ModelPartForEnum< %s >::Enumerations\n",  				e->scoped(), @@ -390,6 +381,7 @@ namespace Slicer {  		fprintbf(cpp, "template<> DLL_PUBLIC\nconst Metadata ModelPartForSequence< %s >::metadata ",  				s->scoped());  		copyMetadata(s->getMetaData()); +		fprintbf(cpp, ";\n\n");  		defineMODELPART(s->scoped(), s, s->getMetaData());  	} @@ -425,7 +417,7 @@ namespace Slicer {  				d->scoped(),  				d->scoped());  		createNewModelPartPtrFor(ktype); -		fprintbf(cpp, ", HookBase >(\"%s\"),\n\t\t", +		fprintbf(cpp, " >(\"%s\"),\n\t\t",  				kname ? *kname : "key");  		auto vtype = d->valueType();  		fprintbf(cpp, "new ModelPartForComplex< %s::value_type >::Hook< %s, %s::value_type, &%s::value_type::second, ", @@ -434,7 +426,7 @@ namespace Slicer {  				d->scoped(),  				d->scoped());  		createNewModelPartPtrFor(vtype); -		fprintbf(cpp, ", HookBase >(\"%s\"),\n", +		fprintbf(cpp, " >(\"%s\"),\n",  				vname ? *vname : "value");  		fprintbf(cpp, "\t};\n");  		fprintbf(cpp, "\n"); @@ -445,10 +437,12 @@ namespace Slicer {  		fprintbf(cpp, "template<> DLL_PUBLIC\nconst Metadata ModelPartForDictionary< %s >::metadata ",  				d->scoped());  		copyMetadata(d->getMetaData()); +		fprintbf(cpp, ";\n\n");  		fprintbf(cpp, "template<> DLL_PUBLIC\nconst Metadata ModelPartForComplex<%s::value_type>::metadata ",  				d->scoped());  		copyMetadata(d->getMetaData()); +		fprintbf(cpp, ";\n\n");  		defineMODELPART(d->scoped(), d, d->getMetaData());  	} @@ -525,7 +519,7 @@ namespace Slicer {  				fprintbf(cpp, "\t\"%s\",\n", md.c_str() + 7);  			}  		} -		fprintbf(cpp, "};\n\n"); +		fprintbf(cpp, "}");  	}  	Slice::StringList  | 
