diff options
author | randomdan <randomdan@localhost> | 2014-09-18 20:44:35 +0000 |
---|---|---|
committer | randomdan <randomdan@localhost> | 2014-09-18 20:44:35 +0000 |
commit | 1364952ac17304a73f45b537f8fe9022c2027492 (patch) | |
tree | eeac7b18361e931e24bf32cc7bc50c1debb1b66c | |
parent | Make slice metadata for the slicer namespace available at runtime (diff) | |
download | slicer-0.8.tar.bz2 slicer-0.8.tar.xz slicer-0.8.zip |
Allow a class to specify a specific name when referenced in a documentslicer-0.8
-rw-r--r-- | slicer/slicer/modelParts.cpp | 27 | ||||
-rw-r--r-- | slicer/slicer/modelParts.h | 8 | ||||
-rw-r--r-- | slicer/slicer/parser.cpp | 12 | ||||
-rw-r--r-- | slicer/test/initial/inherit-mapped.json | 1 | ||||
-rw-r--r-- | slicer/test/run-slicer.cpp | 1 | ||||
-rw-r--r-- | slicer/test/types.ice | 7 |
6 files changed, 54 insertions, 2 deletions
diff --git a/slicer/slicer/modelParts.cpp b/slicer/slicer/modelParts.cpp index f902b92..80d90cf 100644 --- a/slicer/slicer/modelParts.cpp +++ b/slicer/slicer/modelParts.cpp @@ -13,6 +13,33 @@ namespace Slicer { { } + ClassNameMap * & + classNameMap() + { + static ClassNameMap * refs = new ClassNameMap(); + return refs; + } + + const std::string & + ModelPart::ToModelTypeName(const std::string & name) + { + auto mapped = classNameMap()->right.find(name); + if (mapped != classNameMap()->right.end()) { + return mapped->second; + } + return name; + } + + const std::string & + ModelPart::ToExchangeTypeName(const std::string & name) + { + auto mapped = classNameMap()->left.find(name); + if (mapped != classNameMap()->left.end()) { + return mapped->second; + } + return name; + } + ClassRefMap * & classRefMap() { diff --git a/slicer/slicer/modelParts.h b/slicer/slicer/modelParts.h index 2fc43fe..da118bd 100644 --- a/slicer/slicer/modelParts.h +++ b/slicer/slicer/modelParts.h @@ -10,6 +10,7 @@ #include <stdexcept> #include <boost/function.hpp> #include <boost/foreach.hpp> +#include <boost/bimap.hpp> #include <vector> namespace Slicer { @@ -86,6 +87,8 @@ namespace Slicer { typedef boost::function<ModelPartPtr(void *)> ClassRef; typedef std::map<std::string, ClassRef> ClassRefMap; ClassRefMap * & classRefMap(); + typedef boost::bimap<std::string, std::string> ClassNameMap; + ClassNameMap * & classNameMap(); typedef std::set<std::string> Metadata; enum ModelPartType { mpt_Null, @@ -111,6 +114,9 @@ namespace Slicer { virtual void GetValue(ValueTargetPtr); virtual bool HasValue() const = 0; virtual const Metadata & GetMetadata() const; + + static const std::string & ToExchangeTypeName(const std::string &); + static const std::string & ToModelTypeName(const std::string &); }; template<typename T> @@ -340,7 +346,7 @@ namespace Slicer { virtual ModelPartPtr GetSubclassModelPart(const std::string & name) override { - auto ref = classRefMap()->find(name); + auto ref = classRefMap()->find(ModelPart::ToModelTypeName(name)); if (ref == classRefMap()->end()) { throw UnknownType(name); } diff --git a/slicer/slicer/parser.cpp b/slicer/slicer/parser.cpp index fac9ff7..998a0cb 100644 --- a/slicer/slicer/parser.cpp +++ b/slicer/slicer/parser.cpp @@ -134,23 +134,33 @@ namespace Slicer { typeToString(decl).c_str(), name ? name->c_str() : c->name().c_str()); + 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::%s\", [](void * p){ return new ModelPartForClass< %s >(*static_cast< %s *>(p)); } });\n", modulePath().c_str(), c->name().c_str(), typeToString(decl).c_str(), typeToString(decl).c_str()); + if (typeName) { + fprintf(cpp, "\tSlicer::classNameMap()->insert({ \"%s::%s\", \"%s\" });\n", + modulePath().c_str(), c->name().c_str(), + typeName->c_str()); + } 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::%s\");\n", modulePath().c_str(), c->name().c_str()); + if (typeName) { + fprintf(cpp, "\tSlicer::classNameMap()->left.erase(\"%s::%s\");\n", + modulePath().c_str(), c->name().c_str()); + } fprintf(cpp, "}\n\n"); fprintf(cpp, "template<>\nTypeId\nModelPartForClass< %s >::GetTypeId() const\n{\n", typeToString(decl).c_str()); fprintf(cpp, "\tauto id = ModelObject->ice_id();\n"); - fprintf(cpp, "\treturn (id == \"%s::%s\") ? TypeId() : id;\n}\n\n", + fprintf(cpp, "\treturn (id == \"%s::%s\") ? TypeId() : ModelPart::ToExchangeTypeName(id);\n}\n\n", modulePath().c_str(), c->name().c_str()); fprintf(cpp, "template<>\nMetadata ModelPartForComplex< %s::%s >::metadata ", diff --git a/slicer/test/initial/inherit-mapped.json b/slicer/test/initial/inherit-mapped.json new file mode 100644 index 0000000..9157035 --- /dev/null +++ b/slicer/test/initial/inherit-mapped.json @@ -0,0 +1 @@ +{"b":{"a":12.000000,"c":10.000000,"mytype":"onetwo"}} diff --git a/slicer/test/run-slicer.cpp b/slicer/test/run-slicer.cpp index 9cbf74a..8231866 100644 --- a/slicer/test/run-slicer.cpp +++ b/slicer/test/run-slicer.cpp @@ -279,6 +279,7 @@ main(int, char ** argv) verifyByFile<TestModule::Optionals, Slicer::JsonFile>(root, tmpf, "optionals-areset2.json", checkOptionals_areset); verifyByFile<TestModule::InheritanceCont, Slicer::JsonFile>(root, tmpf, "inherit-c.json", checkInherits_types); verifyByFile<TestModule::InheritanceCont2, Slicer::JsonFile>(root, tmpf, "inherit-d.json"); + verifyByFile<TestModule::InheritanceContMapped, Slicer::JsonFile>(root, tmpf, "inherit-mapped.json"); verifyByHelper<TestModule::Optionals, Slicer::JsonValue, json::Value>(root, tmph, "optionals-areset2.json", readJson, writeJson, freeJson, checkOptionals_areset); verifyByHelper<TestModule::Optionals, Slicer::XmlDocument, xmlpp::Document *>(root, tmph, "optionals-areset.xml", readXml, writeXml, freeXml, checkOptionals_areset); diff --git a/slicer/test/types.ice b/slicer/test/types.ice index eb7a8c9..469886d 100644 --- a/slicer/test/types.ice +++ b/slicer/test/types.ice @@ -85,4 +85,11 @@ module TestModule { class InheritanceCont2 { Base2 b; }; + ["slicer:typename:onetwo"] + class D13 extends Base2 { + int c; + }; + class InheritanceContMapped { + Base2 b; + }; }; |