From fe33a067f81e5239ef17ac88868392a87b0b5fe0 Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Wed, 18 Oct 2017 14:55:23 +0100 Subject: Simplify addition of hooks further with addHook helper --- slicer/slicer/modelPartsTypes.h | 3 +++ slicer/slicer/modelPartsTypes.impl.h | 7 +++++++ slicer/tool/parser.cpp | 22 +++++++++++----------- 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/slicer/slicer/modelPartsTypes.h b/slicer/slicer/modelPartsTypes.h index 1af328f..630eec7 100644 --- a/slicer/slicer/modelPartsTypes.h +++ b/slicer/slicer/modelPartsTypes.h @@ -176,6 +176,9 @@ namespace Slicer { typedef std::vector Hooks; + template + static void addHook(Hooks &, const P & ...); + static const Hooks hooks; static const Metadata metadata; }; diff --git a/slicer/slicer/modelPartsTypes.impl.h b/slicer/slicer/modelPartsTypes.impl.h index 282418c..a1a963a 100644 --- a/slicer/slicer/modelPartsTypes.impl.h +++ b/slicer/slicer/modelPartsTypes.impl.h @@ -362,6 +362,13 @@ namespace Slicer { return metadata; } + template + template + void ModelPartForComplex::addHook(Hooks & h, const P & ... p) + { + h.push_back(std::make_unique(p...)); + } + template ModelPartForComplex::HookBase::HookBase(const std::string & n) : HookCommon(n) diff --git a/slicer/tool/parser.cpp b/slicer/tool/parser.cpp index f3c4a2c..ce89e2f 100644 --- a/slicer/tool/parser.cpp +++ b/slicer/tool/parser.cpp @@ -261,9 +261,9 @@ namespace Slicer { if (!t) { t = Slice::ClassDefPtr::dynamicCast(dm->container())->declaration(); } - auto name = metaDataValue("slicer:name:", dm->getMetaData()); - fprintbf(cpp, "\t\tr.push_back(std::make_uniquegetMetaData()).value_or_eval(std::bind(&Slice::DataMember::name, dm)); + fprintbf(cpp, "\t\tC%d::addHooktype(); if (hasMetadata(dm->getMetaData())) { fprintbf(cpp, "HookMetadata<"); @@ -274,14 +274,14 @@ namespace Slicer { fprintbf(cpp, " %s, ", Slice::typeToString(type, dm->optional())); createNewModelPartPtrFor(type, dm, getAllMetadata(dm)); - fprintbf(cpp, " > >(&%s, \"%s\"", + fprintbf(cpp, " > >(r, &%s, \"%s\"", dm->scoped(), - name ? *name : dm->name()); + name); if (hasMetadata(dm->getMetaData())) { fprintbf(cpp, ", Metadata "); copyMetadata(dm->getMetaData()); } - fprintbf(cpp, " ));\n"); + fprintbf(cpp, ");\n"); } fprintbf(cpp, "\t\treturn r;\n"); fprintbf(cpp, "\t}());\n\n"); @@ -385,13 +385,13 @@ namespace Slicer { fprintbf(cpp, "\t\tC%d::Hooks r;\n", components); auto addHook = [&](const std::string & name, const char * element, const Slice::TypePtr & t) { - fprintbf(cpp, "\t\t"); - fprintbf(cpp, "r.push_back(std::make_unique< C%d::Hook< const %s, ", - components, + fprintbf(cpp, "\t\t"); + fprintbf(cpp, "C%d::addHook< C%d::Hook< const %s, ", + components, components, Slice::typeToString(t)); createNewModelPartPtrFor(t); - fprintbf(cpp, " > >(&%s::value_type::%s, \"%s\"));\n", - d->scoped(), + fprintbf(cpp, " > >(r, &%s::value_type::%s, \"%s\");\n", + d->scoped(), element, name); }; -- cgit v1.2.3