diff options
-rw-r--r-- | slicer/slicer/parser.cpp | 438 |
1 files changed, 219 insertions, 219 deletions
diff --git a/slicer/slicer/parser.cpp b/slicer/slicer/parser.cpp index a154420..9c8e28e 100644 --- a/slicer/slicer/parser.cpp +++ b/slicer/slicer/parser.cpp @@ -9,6 +9,7 @@ #include <boost/shared_ptr.hpp> #include <boost/filesystem/convenience.hpp> #include <mutex> +#include <fprintbf.h> namespace fs = boost::filesystem; @@ -31,52 +32,52 @@ namespace Slicer { auto c = Slice::ContainedPtr::dynamicCast(dm->container()); auto conversions = getAllConversions(dm); for (const auto & conversion : conversions) { - fprintf(cpp, "%s %s(const %s &);\n", - conversion.ExchangeType.c_str(), - conversion.ConvertToExchangeFunc.c_str(), - Slice::typeToString(type).c_str()); - fprintf(cpp, "%s %s(const %s &);\n\n", - Slice::typeToString(type).c_str(), - conversion.ConvertToModelFunc.c_str(), - conversion.ExchangeType.c_str()); + fprintbf(cpp, "%s %s(const %s &);\n", + conversion.ExchangeType, + conversion.ConvertToExchangeFunc, + Slice::typeToString(type)); + fprintbf(cpp, "%s %s(const %s &);\n\n", + Slice::typeToString(type), + conversion.ConvertToModelFunc, + conversion.ExchangeType); } if (!conversions.empty()) { - fprintf(cpp, "template<>\nvoid\n"); - fprintf(cpp, "ModelPartForConverted< %s, %s, &%s >::SetValue(ValueSourcePtr vsp)\n", - Slice::typeToString(type).c_str(), - c->scoped().c_str(), - dm->scoped().c_str()); - fprintf(cpp, "{\n"); + fprintbf(cpp, "template<>\nvoid\n"); + fprintbf(cpp, "ModelPartForConverted< %s, %s, &%s >::SetValue(ValueSourcePtr vsp)\n", + Slice::typeToString(type), + c->scoped(), + dm->scoped()); + fprintbf(cpp, "{\n"); for (const auto & conversion : conversions) { - fprintf(cpp, "\tif (auto vspt = dynamic_cast<TValueSource< %s > *>(vsp.get())) {\n", - conversion.ExchangeType.c_str()); - fprintf(cpp, "\t\t%s tmp;\n", - conversion.ExchangeType.c_str()); - fprintf(cpp, "\t\tvspt->set(tmp);\n"); - fprintf(cpp, "\t\tMember = %s(tmp);\n", - conversion.ConvertToModelFunc.c_str()); - fprintf(cpp, "\t\treturn;\n"); - fprintf(cpp, "\t}\n"); + fprintbf(cpp, "\tif (auto vspt = dynamic_cast<TValueSource< %s > *>(vsp.get())) {\n", + conversion.ExchangeType); + fprintbf(cpp, "\t\t%s tmp;\n", + conversion.ExchangeType); + fprintbf(cpp, "\t\tvspt->set(tmp);\n"); + fprintbf(cpp, "\t\tMember = %s(tmp);\n", + conversion.ConvertToModelFunc); + fprintbf(cpp, "\t\treturn;\n"); + fprintbf(cpp, "\t}\n"); } - fprintf(cpp, "}\n\n"); + fprintbf(cpp, "}\n\n"); - fprintf(cpp, "template<>\nvoid\n"); - fprintf(cpp, "ModelPartForConverted< %s, %s, &%s >::GetValue(ValueTargetPtr vtp)\n", - Slice::typeToString(type).c_str(), - c->scoped().c_str(), - dm->scoped().c_str()); - fprintf(cpp, "{\n"); + fprintbf(cpp, "template<>\nvoid\n"); + fprintbf(cpp, "ModelPartForConverted< %s, %s, &%s >::GetValue(ValueTargetPtr vtp)\n", + Slice::typeToString(type), + c->scoped(), + dm->scoped()); + fprintbf(cpp, "{\n"); for (const auto & conversion : conversions) { - fprintf(cpp, "\tif (auto vtpt = dynamic_cast<TValueTarget< %s > *>(vtp.get())) {\n", - conversion.ExchangeType.c_str()); - fprintf(cpp, "\t\tvtpt->get(%s(Member));\n", - conversion.ConvertToExchangeFunc.c_str()); - fprintf(cpp, "\t\treturn;\n"); - fprintf(cpp, "\t}\n"); + fprintbf(cpp, "\tif (auto vtpt = dynamic_cast<TValueTarget< %s > *>(vtp.get())) {\n", + conversion.ExchangeType); + fprintbf(cpp, "\t\tvtpt->get(%s(Member));\n", + conversion.ConvertToExchangeFunc); + fprintbf(cpp, "\t\treturn;\n"); + fprintbf(cpp, "\t}\n"); } - fprintf(cpp, "}\n\n"); + fprintbf(cpp, "}\n\n"); } } @@ -86,13 +87,13 @@ namespace Slicer { fs::path topLevelFile(u->topLevelFile()); if (!cpp) return true; - fprintf(cpp, "// Begin Slicer code\n\n"); - fprintf(cpp, "#include <%s>\n\n", fs::change_extension(topLevelFile.filename(), ".h").string().c_str()); - fprintf(cpp, "#include <slicer/modelParts.h>\n\n"); - fprintf(cpp, "#define templateMODELPARTFOR(Type, ModelPart) \\\n"); - fprintf(cpp, "template <> ModelPartPtr DLL_PUBLIC ModelPartFor(Type & t) { return new ModelPart< Type >(t); } \\\n"); - fprintf(cpp, "template <> ModelPartPtr DLL_PUBLIC ModelPartFor(Type * t) { return new ModelPart< Type >(t); }\n\n"); - fprintf(cpp, "namespace Slicer {\n"); + fprintbf(cpp, "// Begin Slicer code\n\n"); + fprintbf(cpp, "#include <%s>\n\n", fs::change_extension(topLevelFile.filename(), ".h").string()); + fprintbf(cpp, "#include <slicer/modelParts.h>\n\n"); + fprintbf(cpp, "#define templateMODELPARTFOR(Type, ModelPart) \\\n"); + fprintbf(cpp, "template <> ModelPartPtr DLL_PUBLIC ModelPartFor(Type & t) { return new ModelPart< Type >(t); } \\\n"); + fprintbf(cpp, "template <> ModelPartPtr DLL_PUBLIC ModelPartFor(Type * t) { return new ModelPart< Type >(t); }\n\n"); + fprintbf(cpp, "namespace Slicer {\n"); return true; } @@ -101,8 +102,8 @@ namespace Slicer { { if (!cpp) return; - fprintf(cpp, "}\n\n"); - fprintf(cpp, "// End Slicer code\n\n"); + fprintbf(cpp, "}\n\n"); + fprintbf(cpp, "// End Slicer code\n\n"); } bool @@ -110,7 +111,7 @@ namespace Slicer { { if (!cpp) return true; - fprintf(cpp, "// Begin module %s\n\n", m->name().c_str()); + fprintbf(cpp, "// Begin module %s\n\n", m->name()); for (const auto & c : m->structs()) { for (const auto & dm : c->dataMembers()) { defineConversions(dm); @@ -128,9 +129,9 @@ namespace Slicer { void Slicer::defineRootName(const std::string & type, const std::string & name) const { - fprintf(cpp, "template<>\n"); - fprintf(cpp, "DLL_PUBLIC std::string ModelPartForRoot< %s >::rootName(\"%s\");\n\n", - type.c_str(), name.c_str()); + fprintbf(cpp, "template<>\n"); + fprintbf(cpp, "DLL_PUBLIC std::string ModelPartForRoot< %s >::rootName(\"%s\");\n\n", + type, name); } bool @@ -144,53 +145,53 @@ namespace Slicer { if (!cpp) return true; auto decl = c->declaration(); - fprintf(cpp, "// Class %s\n", c->name().c_str()); + fprintbf(cpp, "// Class %s\n", c->name()); visitComplexDataMembers(decl, c->allDataMembers()); - - fprintf(cpp, "template<>\n"); + + fprintbf(cpp, "template<>\n"); auto typeId = metaDataValue("slicer:typeid:", c->getMetaData()); - fprintf(cpp, "DLL_PUBLIC std::string ModelPartForClass< %s >::typeIdProperty(\"%s\");\n\n", - typeToString(decl).c_str(), - typeId ? typeId->c_str() : "slicer-typeid"); + fprintbf(cpp, "DLL_PUBLIC std::string ModelPartForClass< %s >::typeIdProperty(\"%s\");\n\n", + typeToString(decl), + typeId ? *typeId : "slicer-typeid"); auto name = metaDataValue("slicer:root:", c->getMetaData()); defineRootName(typeToString(decl), name ? *name : c->name()); auto typeName = metaDataValue("slicer:typename:", c->getMetaData()); - fprintf(cpp, "static void registerClass_%u() __attribute__ ((constructor(210)));\n", classNo); - fprintf(cpp, "static void registerClass_%u()\n{\n", classNo); - fprintf(cpp, "\tSlicer::classRefMap()->insert({ \"%s\", [](void * p){ return new ModelPartForClass< %s >(*static_cast< %s *>(p)); } });\n", - c->scoped().c_str(), - typeToString(decl).c_str(), - typeToString(decl).c_str()); + fprintbf(cpp, "static void registerClass_%u() __attribute__ ((constructor(210)));\n", classNo); + fprintbf(cpp, "static void registerClass_%u()\n{\n", classNo); + fprintbf(cpp, "\tSlicer::classRefMap()->insert({ \"%s\", [](void * p){ return new ModelPartForClass< %s >(*static_cast< %s *>(p)); } });\n", + c->scoped(), + typeToString(decl), + typeToString(decl)); if (typeName) { - fprintf(cpp, "\tSlicer::classNameMap()->insert({ \"%s\", \"%s\" });\n", - c->scoped().c_str(), - typeName->c_str()); + fprintbf(cpp, "\tSlicer::classNameMap()->insert({ \"%s\", \"%s\" });\n", + c->scoped(), + *typeName); } - fprintf(cpp, "}\n\n"); - fprintf(cpp, "static void unregisterClass_%u() __attribute__ ((destructor(210)));\n", classNo); - fprintf(cpp, "static void unregisterClass_%u()\n{\n", classNo); - fprintf(cpp, "\tSlicer::classRefMap()->erase(\"%s\");\n", - c->scoped().c_str()); + fprintbf(cpp, "}\n\n"); + fprintbf(cpp, "static void unregisterClass_%u() __attribute__ ((destructor(210)));\n", classNo); + fprintbf(cpp, "static void unregisterClass_%u()\n{\n", classNo); + fprintbf(cpp, "\tSlicer::classRefMap()->erase(\"%s\");\n", + c->scoped()); if (typeName) { - fprintf(cpp, "\tSlicer::classNameMap()->left.erase(\"%s\");\n", - c->scoped().c_str()); + fprintbf(cpp, "\tSlicer::classNameMap()->left.erase(\"%s\");\n", + c->scoped()); } - fprintf(cpp, "}\n\n"); + fprintbf(cpp, "}\n\n"); - fprintf(cpp, "template<>\nDLL_PUBLIC TypeId\nModelPartForClass< %s >::GetTypeId() const\n{\n", - typeToString(decl).c_str()); - fprintf(cpp, "\tauto id = ModelObject->ice_id();\n"); - fprintf(cpp, "\treturn (id == \"%s\") ? TypeId() : ModelPart::ToExchangeTypeName(id);\n}\n\n", - c->scoped().c_str()); + fprintbf(cpp, "template<>\nDLL_PUBLIC TypeId\nModelPartForClass< %s >::GetTypeId() const\n{\n", + typeToString(decl)); + fprintbf(cpp, "\tauto id = ModelObject->ice_id();\n"); + fprintbf(cpp, "\treturn (id == \"%s\") ? TypeId() : ModelPart::ToExchangeTypeName(id);\n}\n\n", + c->scoped()); - fprintf(cpp, "template<>\nDLL_PUBLIC Metadata ModelPartForComplex< %s >::metadata ", - c->scoped().c_str()); + fprintbf(cpp, "template<>\nDLL_PUBLIC Metadata ModelPartForComplex< %s >::metadata ", + c->scoped()); copyMetadata(c->getMetaData()); - fprintf(cpp, "templateMODELPARTFOR(::IceInternal::Handle< %s >, ModelPartForClass);\n\n", - c->scoped().c_str()); + fprintbf(cpp, "templateMODELPARTFOR(::IceInternal::Handle< %s >, ModelPartForClass);\n\n", + c->scoped()); classNo += 1; @@ -206,18 +207,18 @@ namespace Slicer { if (!cpp) return true; - fprintf(cpp, "// Struct %s\n", c->name().c_str()); + fprintbf(cpp, "// Struct %s\n", c->name()); visitComplexDataMembers(c, c->dataMembers()); auto name = metaDataValue("slicer:root:", c->getMetaData()); defineRootName(c->scoped(), name ? *name : c->name()); - fprintf(cpp, "template<>\nDLL_PUBLIC Metadata ModelPartForComplex< %s >::metadata ", - c->scoped().c_str()); + fprintbf(cpp, "template<>\nDLL_PUBLIC Metadata ModelPartForComplex< %s >::metadata ", + c->scoped()); copyMetadata(c->getMetaData()); - fprintf(cpp, "templateMODELPARTFOR(%s, ModelPartForStruct);\n\n", - c->scoped().c_str()); + fprintbf(cpp, "templateMODELPARTFOR(%s, ModelPartForStruct);\n\n", + c->scoped()); return true; } @@ -227,11 +228,11 @@ namespace Slicer { { if (!cpp) return; - fprintf(cpp, "template<>\n"); - fprintf(cpp, "DLL_PUBLIC ModelPartForComplex< %s >::Hooks ", - it->scoped().c_str()); - fprintf(cpp, "ModelPartForComplex< %s >::hooks {\n", - it->scoped().c_str()); + fprintbf(cpp, "template<>\n"); + fprintbf(cpp, "DLL_PUBLIC ModelPartForComplex< %s >::Hooks ", + it->scoped()); + fprintbf(cpp, "ModelPartForComplex< %s >::hooks {\n", + it->scoped()); for (const auto & dm : dataMembers) { auto c = Slice::ContainedPtr::dynamicCast(dm->container()); auto t = Slice::TypePtr::dynamicCast(dm->container()); @@ -240,36 +241,36 @@ namespace Slicer { } auto name = metaDataValue("slicer:name:", dm->getMetaData()); auto conversions = getAllConversions(dm); - fprintf(cpp, "\t\tnew "); + fprintbf(cpp, "\t\tnew "); auto type = dm->type(); createNewModelPartPtrFor(t); - fprintf(cpp, "< %s >::Hook< %s", - typeToString(it).c_str(), - Slice::typeToString(type, dm->optional()).c_str()); - fprintf(cpp, ", %s, &%s, ", - boost::algorithm::trim_right_copy_if(dm->container()->thisScope(), ispunct).c_str(), - dm->scoped().c_str()); + fprintbf(cpp, "< %s >::Hook< %s", + typeToString(it), + Slice::typeToString(type, dm->optional())); + fprintbf(cpp, ", %s, &%s, ", + boost::algorithm::trim_right_copy_if(dm->container()->thisScope(), ispunct), + dm->scoped()); if (dm->optional()) { - fprintf(cpp, "ModelPartForOptional< "); + fprintbf(cpp, "ModelPartForOptional< "); } if (!conversions.empty()) { - fprintf(cpp, "ModelPartForConverted< %s, %s, &%s >", - Slice::typeToString(type).c_str(), - boost::algorithm::trim_right_copy_if(dm->container()->thisScope(), ispunct).c_str(), - dm->scoped().c_str()); + fprintbf(cpp, "ModelPartForConverted< %s, %s, &%s >", + Slice::typeToString(type), + boost::algorithm::trim_right_copy_if(dm->container()->thisScope(), ispunct), + dm->scoped()); } else { createNewModelPartPtrFor(type); - fprintf(cpp, "< %s >", - Slice::typeToString(type).c_str()); + fprintbf(cpp, "< %s >", + Slice::typeToString(type)); } if (dm->optional()) { - fprintf(cpp, " > "); + fprintbf(cpp, " > "); } - fprintf(cpp, " >(\"%s\"),\n", - name ? name->c_str() : dm->name().c_str()); + fprintbf(cpp, " >(\"%s\"),\n", + name ? *name : dm->name()); } - fprintf(cpp, "\t};\n\n"); + fprintbf(cpp, "\t};\n\n"); for (const auto & dm : dataMembers) { auto c = Slice::ContainedPtr::dynamicCast(dm->container()); @@ -278,14 +279,14 @@ namespace Slicer { t = Slice::ClassDefPtr::dynamicCast(dm->container())->declaration(); } auto type = dm->type(); - fprintf(cpp, "template<>\ntemplate<>\nMetadata\n"); + fprintbf(cpp, "template<>\ntemplate<>\nMetadata\n"); createNewModelPartPtrFor(t); - fprintf(cpp, "< %s >::HookMetadata< %s", - typeToString(it).c_str(), - Slice::typeToString(type, dm->optional()).c_str()); - fprintf(cpp, ", %s, &%s >::metadata ", - boost::algorithm::trim_right_copy_if(dm->container()->thisScope(), ispunct).c_str(), - dm->scoped().c_str()); + fprintbf(cpp, "< %s >::HookMetadata< %s", + typeToString(it), + 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()); } } @@ -299,45 +300,44 @@ namespace Slicer { if (!cpp) return; - fprintf(cpp, "// Enumeration %s\n", e->name().c_str()); - fprintf(cpp, "template<>\nMetadata ModelPartForEnum< %s >::metadata ", - e->scoped().c_str()); + fprintbf(cpp, "// Enumeration %s\n", e->name()); + fprintbf(cpp, "template<>\nMetadata ModelPartForEnum< %s >::metadata ", + e->scoped()); copyMetadata(e->getMetaData()); - fprintf(cpp, "template<>\nModelPartForEnum< %s >::Enumerations\nModelPartForEnum< %s >::enumerations([]() -> ModelPartForEnum< %s >::Enumerations\n", - e->scoped().c_str(), - e->scoped().c_str(), - e->scoped().c_str()); - fprintf(cpp, "{\n\tModelPartForEnum< %s >::Enumerations e;\n", - e->scoped().c_str()); + fprintbf(cpp, "template<>\nModelPartForEnum< %s >::Enumerations\nModelPartForEnum< %s >::enumerations([]() -> ModelPartForEnum< %s >::Enumerations\n", + e->scoped(), + e->scoped(), + e->scoped()); + fprintbf(cpp, "{\n\tModelPartForEnum< %s >::Enumerations e;\n", + e->scoped()); for (const auto & ee : e->getEnumerators()) { - fprintf(cpp, "\te.insert( { %s, \"%s\" } );\n", ee->scoped().c_str(), ee->name().c_str()); - + fprintbf(cpp, "\te.insert( { %s, \"%s\" } );\n", ee->scoped(), ee->name()); } - fprintf(cpp, "\treturn e;\n}());\n\n"); + fprintbf(cpp, "\treturn e;\n}());\n\n"); - fprintf(cpp, "template<>\nvoid ModelPartForEnum< %s >::SetValue(ValueSourcePtr s) {\n\ + fprintbf(cpp, "template<>\nvoid ModelPartForEnum< %s >::SetValue(ValueSourcePtr s) {\n\ std::string val;\n\ s->set(val);\n\ auto i = enumerations.right.find(val);\n\ if (i == enumerations.right.end()) throw InvalidEnumerationValue(val, \"%s\");\n\ modelPart = i->second;\n\ }\n\n", - e->scoped().c_str(), - e->scoped().c_str()); - fprintf(cpp, "template<>\nvoid ModelPartForEnum< %s >::GetValue(ValueTargetPtr s) {\n\ + e->scoped(), + e->scoped()); + fprintbf(cpp, "template<>\nvoid ModelPartForEnum< %s >::GetValue(ValueTargetPtr s) {\n\ auto i = enumerations.left.find(modelPart);\n\ if (i == enumerations.left.end()) throw InvalidEnumerationValue((::Ice::Int)modelPart, \"%s\");\n\ s->get(i->second);\n\ }\n\n", - e->scoped().c_str(), - e->scoped().c_str()); + e->scoped(), + e->scoped()); auto name = metaDataValue("slicer:root:", e->getMetaData()); defineRootName(e->scoped(), name ? *name : e->name()); - fprintf(cpp, "templateMODELPARTFOR(%s, ModelPartForEnum);\n\n", - e->scoped().c_str()); + fprintbf(cpp, "templateMODELPARTFOR(%s, ModelPartForEnum);\n\n", + e->scoped()); } void @@ -349,42 +349,42 @@ namespace Slicer { if (!cpp) return; - fprintf(cpp, "// Sequence %s\n", s->name().c_str()); - fprintf(cpp, "template<>\n"); - fprintf(cpp, "DLL_PUBLIC ChildRefPtr ModelPartForSequence< %s >::GetChildRef(const std::string & name, const HookFilter & flt)\n{\n", - s->scoped().c_str()); + fprintbf(cpp, "// Sequence %s\n", s->name()); + fprintbf(cpp, "template<>\n"); + fprintbf(cpp, "DLL_PUBLIC ChildRefPtr ModelPartForSequence< %s >::GetChildRef(const std::string & name, const HookFilter & flt)\n{\n", + s->scoped()); auto iname = metaDataValue("slicer:item:", s->getMetaData()); if (iname) { - fprintf(cpp, "\tif (!name.empty() && name != \"%s\") { throw IncorrectElementName(); }\n", - iname->c_str()); + fprintbf(cpp, "\tif (!name.empty() && name != \"%s\") { throw IncorrectElementName(); }\n", + *iname); } else { - fprintf(cpp, "\t(void)name;\n"); + fprintbf(cpp, "\t(void)name;\n"); } - fprintf(cpp, "\treturn GetAnonChildRef(flt);\n}\n\n"); - - fprintf(cpp, "template<>\n"); - fprintf(cpp, "DLL_PUBLIC ModelPartPtr\n"); - fprintf(cpp, "ModelPartForSequence< %s >::elementModelPart(typename %s::value_type & e) const {\n", - s->scoped().c_str(), - s->scoped().c_str()); - fprintf(cpp, "\treturn ModelPartFor(e);\n}\n\n"); - - fprintf(cpp, "template<>\n"); + fprintbf(cpp, "\treturn GetAnonChildRef(flt);\n}\n\n"); + + fprintbf(cpp, "template<>\n"); + fprintbf(cpp, "DLL_PUBLIC ModelPartPtr\n"); + fprintbf(cpp, "ModelPartForSequence< %s >::elementModelPart(typename %s::value_type & e) const {\n", + s->scoped(), + s->scoped()); + fprintbf(cpp, "\treturn ModelPartFor(e);\n}\n\n"); + + fprintbf(cpp, "template<>\n"); auto ename = metaDataValue("slicer:element:", s->getMetaData()); - fprintf(cpp, "DLL_PUBLIC std::string ModelPartForSequence< %s >::elementName(\"%s\");\n\n", - s->scoped().c_str(), - ename ? ename->c_str() : "element"); + fprintbf(cpp, "DLL_PUBLIC std::string ModelPartForSequence< %s >::elementName(\"%s\");\n\n", + s->scoped(), + ename ? *ename : "element"); auto name = metaDataValue("slicer:root:", s->getMetaData()); defineRootName(s->scoped(), name ? *name : s->name()); - fprintf(cpp, "template<>\nDLL_PUBLIC Metadata ModelPartForSequence< %s >::metadata ", - s->scoped().c_str()); + fprintbf(cpp, "template<>\nDLL_PUBLIC Metadata ModelPartForSequence< %s >::metadata ", + s->scoped()); copyMetadata(s->getMetaData()); - fprintf(cpp, "templateMODELPARTFOR(%s, ModelPartForSequence);\n\n", - s->scoped().c_str()); + fprintbf(cpp, "templateMODELPARTFOR(%s, ModelPartForSequence);\n\n", + s->scoped()); } void @@ -396,75 +396,75 @@ namespace Slicer { if (!cpp) return; - fprintf(cpp, "// Dictionary %s\n", d->name().c_str()); + fprintbf(cpp, "// Dictionary %s\n", d->name()); auto iname = metaDataValue("slicer:item:", d->getMetaData()); - fprintf(cpp, "template<>\n"); - fprintf(cpp, "DLL_PUBLIC std::string ModelPartForDictionary< %s >::pairName(\"%s\");\n\n", - d->scoped().c_str(), - iname ? iname->c_str() : "element"); - - fprintf(cpp, "template<>\n"); - fprintf(cpp, "DLL_PUBLIC ModelPartForComplex< ModelPartForDictionaryElement< %s > >::Hooks ", - d->scoped().c_str()); - fprintf(cpp, "ModelPartForComplex< ModelPartForDictionaryElement< %s > >::hooks {\n", - d->scoped().c_str()); + fprintbf(cpp, "template<>\n"); + fprintbf(cpp, "DLL_PUBLIC std::string ModelPartForDictionary< %s >::pairName(\"%s\");\n\n", + d->scoped(), + iname ? *iname : "element"); + + fprintbf(cpp, "template<>\n"); + fprintbf(cpp, "DLL_PUBLIC ModelPartForComplex< ModelPartForDictionaryElement< %s > >::Hooks ", + d->scoped()); + fprintbf(cpp, "ModelPartForComplex< ModelPartForDictionaryElement< %s > >::hooks {\n", + d->scoped()); auto kname = metaDataValue("slicer:key:", d->getMetaData()); auto vname = metaDataValue("slicer:value:", d->getMetaData()); - fprintf(cpp, "\t\t"); + fprintbf(cpp, "\t\t"); auto ktype = d->keyType(); - fprintf(cpp, "new ModelPartForDictionaryElement< %s >::Hook< %s*, ModelPartForDictionaryElement< %s >, &ModelPartForDictionaryElement< %s >::key, ", - d->scoped().c_str(), - Slice::typeToString(ktype).c_str(), - d->scoped().c_str(), - d->scoped().c_str()); + fprintbf(cpp, "new ModelPartForDictionaryElement< %s >::Hook< %s*, ModelPartForDictionaryElement< %s >, &ModelPartForDictionaryElement< %s >::key, ", + d->scoped(), + Slice::typeToString(ktype), + d->scoped(), + d->scoped()); createNewModelPartPtrFor(ktype); - fprintf(cpp, "< %s > >(\"%s\"),\n\t\t", - Slice::typeToString(ktype).c_str(), - kname ? kname->c_str() : "key"); + fprintbf(cpp, "< %s > >(\"%s\"),\n\t\t", + Slice::typeToString(ktype), + kname ? *kname : "key"); auto vtype = d->valueType(); - fprintf(cpp, "new ModelPartForDictionaryElement< %s >::Hook< %s*, ModelPartForDictionaryElement< %s >, &ModelPartForDictionaryElement< %s >::value, ", - d->scoped().c_str(), - Slice::typeToString(vtype).c_str(), - d->scoped().c_str(), - d->scoped().c_str()); + fprintbf(cpp, "new ModelPartForDictionaryElement< %s >::Hook< %s*, ModelPartForDictionaryElement< %s >, &ModelPartForDictionaryElement< %s >::value, ", + d->scoped(), + Slice::typeToString(vtype), + d->scoped(), + d->scoped()); createNewModelPartPtrFor(vtype); - fprintf(cpp, "< %s > >(\"%s\"),\n", - Slice::typeToString(vtype).c_str(), - vname ? vname->c_str() : "value"); - fprintf(cpp, "\t};\n"); - fprintf(cpp, "\n"); + fprintbf(cpp, "< %s > >(\"%s\"),\n", + Slice::typeToString(vtype), + vname ? *vname : "value"); + fprintbf(cpp, "\t};\n"); + fprintbf(cpp, "\n"); auto name = metaDataValue("slicer:root:", d->getMetaData()); defineRootName(d->scoped(), name ? *name : d->name()); - fprintf(cpp, "template<>\nDLL_PUBLIC Metadata ModelPartForDictionary< %s >::metadata ", - d->scoped().c_str()); + fprintbf(cpp, "template<>\nDLL_PUBLIC Metadata ModelPartForDictionary< %s >::metadata ", + d->scoped()); copyMetadata(d->getMetaData()); - fprintf(cpp, "template<>\nDLL_PUBLIC Metadata ModelPartForComplex<ModelPartForDictionaryElement< %s > >::metadata ", - d->scoped().c_str()); + fprintbf(cpp, "template<>\nDLL_PUBLIC Metadata ModelPartForComplex<ModelPartForDictionaryElement< %s > >::metadata ", + d->scoped()); copyMetadata(d->getMetaData()); - fprintf(cpp, "template<>\ntemplate<>\nMetadata\nModelPartForDictionaryElement< %s >::HookMetadata< %s*, ModelPartForDictionaryElement< %s >, &ModelPartForDictionaryElement< %s >::key >::metadata { };\n\n", - d->scoped().c_str(), - Slice::typeToString(ktype).c_str(), - d->scoped().c_str(), - d->scoped().c_str()); - fprintf(cpp, "template<>\ntemplate<>\nMetadata\nModelPartForDictionaryElement< %s >::HookMetadata< %s*, ModelPartForDictionaryElement< %s >, &ModelPartForDictionaryElement< %s >::value >::metadata { };\n\n", - d->scoped().c_str(), - Slice::typeToString(vtype).c_str(), - d->scoped().c_str(), - d->scoped().c_str()); - - fprintf(cpp, "templateMODELPARTFOR(%s, ModelPartForDictionary);\n\n", - d->scoped().c_str()); + fprintbf(cpp, "template<>\ntemplate<>\nMetadata\nModelPartForDictionaryElement< %s >::HookMetadata< %s*, ModelPartForDictionaryElement< %s >, &ModelPartForDictionaryElement< %s >::key >::metadata { };\n\n", + d->scoped(), + Slice::typeToString(ktype), + d->scoped(), + d->scoped()); + fprintbf(cpp, "template<>\ntemplate<>\nMetadata\nModelPartForDictionaryElement< %s >::HookMetadata< %s*, ModelPartForDictionaryElement< %s >, &ModelPartForDictionaryElement< %s >::value >::metadata { };\n\n", + d->scoped(), + Slice::typeToString(vtype), + d->scoped(), + d->scoped()); + + fprintbf(cpp, "templateMODELPARTFOR(%s, ModelPartForDictionary);\n\n", + d->scoped()); } void Slicer::visitModuleEnd(const Slice::ModulePtr & m) { if (cpp) { - fprintf(cpp, "// End module %s\n\n", m->name().c_str()); + fprintbf(cpp, "// End module %s\n\n", m->name()); } } @@ -472,35 +472,35 @@ namespace Slicer { Slicer::createNewModelPartPtrFor(const Slice::TypePtr & type) const { if (auto builtin = Slice::BuiltinPtr::dynamicCast(type)) { - fprintf(cpp, "ModelPartForSimple"); + fprintbf(cpp, "ModelPartForSimple"); } else if (auto complexClass = Slice::ClassDeclPtr::dynamicCast(type)) { - fprintf(cpp, "ModelPartForClass"); + fprintbf(cpp, "ModelPartForClass"); } else if (auto complexStruct = Slice::StructPtr::dynamicCast(type)) { - fprintf(cpp, "ModelPartForStruct"); + fprintbf(cpp, "ModelPartForStruct"); } else if (auto sequence = Slice::SequencePtr::dynamicCast(type)) { - fprintf(cpp, "ModelPartForSequence"); + fprintbf(cpp, "ModelPartForSequence"); } else if (auto dictionary = Slice::DictionaryPtr::dynamicCast(type)) { - fprintf(cpp, "ModelPartForDictionary"); + fprintbf(cpp, "ModelPartForDictionary"); } else if (auto enumeration = Slice::EnumPtr::dynamicCast(type)) { - fprintf(cpp, "ModelPartForEnum"); + fprintbf(cpp, "ModelPartForEnum"); } } void Slicer::copyMetadata(const std::list<std::string> & metadata) const { - fprintf(cpp, "{\n"); + fprintbf(cpp, "{\n"); for (const auto & md : metadata) { if (boost::algorithm::starts_with(md, "slicer:")) { - fprintf(cpp, "\t\"%.*s\",\n", (int)md.length() - 7, md.c_str() + 7); + fprintbf(cpp, "\t\"%s\",\n", md.c_str() + 7); } } - fprintf(cpp, "};\n\n"); + fprintbf(cpp, "};\n\n"); } Slicer::Conversions @@ -548,7 +548,7 @@ namespace Slicer { unsigned int Slicer::Apply(const boost::filesystem::path & ice, const boost::filesystem::path & cpp, const Args & args) { - FilePtr cppfile(fopen(cpp.string().c_str(), "a"), fclose); + FilePtr cppfile(fopen(cpp.string(), "a"), fclose); if (!cppfile) { throw std::runtime_error("failed to open code file"); } |