diff options
-rw-r--r-- | slicer/slicer/modelPartsTypes.h | 16 | ||||
-rw-r--r-- | slicer/tool/parser.cpp | 20 |
2 files changed, 19 insertions, 17 deletions
diff --git a/slicer/slicer/modelPartsTypes.h b/slicer/slicer/modelPartsTypes.h index 02af753..363891d 100644 --- a/slicer/slicer/modelPartsTypes.h +++ b/slicer/slicer/modelPartsTypes.h @@ -112,17 +112,18 @@ namespace Slicer { }; typedef IceUtil::Handle<HookBase> HookPtr; - template <typename MT, typename CT, MT CT::*M, typename MP> + template <typename MT, typename CT, typename MP> class DLL_PRIVATE Hook : public HookBase { public: - Hook(const std::string & n) : + Hook(MT CT::* m, const std::string & n) : + member(m), name(n) { } ModelPartPtr Get(T * t) const override { - return t ? new MP(const_cast<typename std::remove_const<MT>::type &>(t->*M)) : NULL; + return t ? new MP(const_cast<typename std::remove_const<MT>::type &>(t->*member)) : NULL; } std::string PartName() const override @@ -131,14 +132,15 @@ namespace Slicer { } private: + const MT CT::* member; const std::string name; }; - template <typename MT, typename CT, MT CT::*M, typename MP> - class DLL_PRIVATE HookMetadata : public Hook<MT, CT, M, MP> { + template <typename MT, typename CT, typename MP> + class DLL_PRIVATE HookMetadata : public Hook<MT, CT, MP> { public: - HookMetadata(const std::string & n, const Metadata & md) : - Hook<MT, CT, M, MP>(n), + HookMetadata(MT CT::* member, const std::string & n, const Metadata & md) : + Hook<MT, CT, MP>(member, n), metadata(md) { } diff --git a/slicer/tool/parser.cpp b/slicer/tool/parser.cpp index e880d1c..5aa5f5c 100644 --- a/slicer/tool/parser.cpp +++ b/slicer/tool/parser.cpp @@ -275,9 +275,8 @@ namespace Slicer { } fprintbf(cpp, " %s", Slice::typeToString(type, dm->optional())); - fprintbf(cpp, ", %s, &%s, ", - boost::algorithm::trim_right_copy_if(dm->container()->thisScope(), ispunct), - dm->scoped()); + fprintbf(cpp, ", %s, ", + boost::algorithm::trim_right_copy_if(dm->container()->thisScope(), ispunct)); if (dm->optional()) { fprintbf(cpp, "ModelPartForOptional< "); } @@ -285,7 +284,8 @@ namespace Slicer { if (dm->optional()) { fprintbf(cpp, " > "); } - fprintbf(cpp, " >(\"%s\"", + fprintbf(cpp, " >(&%s, \"%s\"", + dm->scoped(), name ? *name : dm->name()); if (hasMetadata(dm->getMetaData())) { fprintbf(cpp, ", "); @@ -411,22 +411,22 @@ namespace Slicer { auto vname = metaDataValue("slicer:value:", d->getMetaData()); fprintbf(cpp, "\t\t"); auto ktype = d->keyType(); - fprintbf(cpp, "new ModelPartForComplex< %s::value_type >::Hook< const %s, %s::value_type, &%s::value_type::first, ", + fprintbf(cpp, "new ModelPartForComplex< %s::value_type >::Hook< const %s, %s::value_type, ", d->scoped(), Slice::typeToString(ktype), - d->scoped(), d->scoped()); createNewModelPartPtrFor(ktype); - fprintbf(cpp, " >(\"%s\"),\n\t\t", + fprintbf(cpp, " >(&%s::value_type::first, \"%s\"),\n\t\t", + d->scoped(), kname ? *kname : "key"); auto vtype = d->valueType(); - fprintbf(cpp, "new ModelPartForComplex< %s::value_type >::Hook< %s, %s::value_type, &%s::value_type::second, ", + fprintbf(cpp, "new ModelPartForComplex< %s::value_type >::Hook< %s, %s::value_type, ", d->scoped(), Slice::typeToString(vtype), - d->scoped(), d->scoped()); createNewModelPartPtrFor(vtype); - fprintbf(cpp, " >(\"%s\"),\n", + fprintbf(cpp, " >(&%s::value_type::second, \"%s\"),\n", + d->scoped(), vname ? *vname : "value"); fprintbf(cpp, "\t};\n"); fprintbf(cpp, "\n"); |