diff options
author | Dan Goodliffe <dan@randomdan.homeip.net> | 2015-01-26 01:16:21 +0000 |
---|---|---|
committer | Dan Goodliffe <dan@randomdan.homeip.net> | 2015-01-26 01:16:21 +0000 |
commit | f92d61814158825e7cbf71eefaac6d79373167fb (patch) | |
tree | 221893de1156d59ca86149c7878bb5c88ef5e0f1 | |
parent | Ignore Vim swap files (diff) | |
download | slicer-f92d61814158825e7cbf71eefaac6d79373167fb.tar.bz2 slicer-f92d61814158825e7cbf71eefaac6d79373167fb.tar.xz slicer-f92d61814158825e7cbf71eefaac6d79373167fb.zip |
Explicitly implement the auto modelpart deduction templates
-rw-r--r-- | slicer/slicer/modelParts.h | 13 | ||||
-rw-r--r-- | slicer/slicer/parser.cpp | 15 |
2 files changed, 15 insertions, 13 deletions
diff --git a/slicer/slicer/modelParts.h b/slicer/slicer/modelParts.h index a28de0c..5b1e634 100644 --- a/slicer/slicer/modelParts.h +++ b/slicer/slicer/modelParts.h @@ -664,19 +664,6 @@ namespace Slicer { static std::string pairName; static Metadata metadata; }; - - // Templates for automatically determining a model part implementation -#define templateMODELPARTFOR(Type, ModelPart) \ - template <class T> ModelPartPtr ModelPartFor(Type & t) { return new ModelPart< Type >(t); } \ - template <class T> ModelPartPtr ModelPartFor(Type * t) { return new ModelPart< Type >(t); } - templateMODELPARTFOR(IceInternal::Handle<T>, ModelPartForClass); - templateMODELPARTFOR(std::vector<T>, ModelPartForSequence); - templateMODELPARTFOR(std::list<T>, ModelPartForSequence); - template <class K, class V> ModelPartPtr ModelPartFor(std::map<K, V> & t) { return new ModelPartForDictionary< std::map<K, V> >(t); } \ - template <class K, class V> ModelPartPtr ModelPartFor(std::map<K, V> * t) { return new ModelPartForDictionary< std::map<K, V> >(t); } \ - // Everything else is a struct? - templateMODELPARTFOR(T, ModelPartForStruct); -#undef templateMODELPARTFOR } #endif diff --git a/slicer/slicer/parser.cpp b/slicer/slicer/parser.cpp index d2d05a2..a4ee2dd 100644 --- a/slicer/slicer/parser.cpp +++ b/slicer/slicer/parser.cpp @@ -89,6 +89,9 @@ namespace Slicer { 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 ModelPartFor(Type & t) { return new ModelPart< Type >(t); } \\\n"); + fprintf(cpp, "template <> ModelPartPtr ModelPartFor(Type * t) { return new ModelPart< Type >(t); }\n\n"); fprintf(cpp, "namespace Slicer {\n"); return true; } @@ -188,6 +191,9 @@ namespace Slicer { c->scoped().c_str()); copyMetadata(c->getMetaData()); + fprintf(cpp, "templateMODELPARTFOR(::IceInternal::Handle< %s >, ModelPartForClass);\n\n", + c->scoped().c_str()); + classNo += 1; return true; @@ -212,6 +218,9 @@ namespace Slicer { c->scoped().c_str()); copyMetadata(c->getMetaData()); + fprintf(cpp, "templateMODELPARTFOR(%s, ModelPartForStruct);\n\n", + c->scoped().c_str()); + return true; } @@ -325,6 +334,9 @@ namespace Slicer { fprintf(cpp, "template<>\nMetadata ModelPartForSequence< %s >::metadata ", s->scoped().c_str()); copyMetadata(s->getMetaData()); + + fprintf(cpp, "templateMODELPARTFOR(%s, ModelPartForSequence);\n\n", + s->scoped().c_str()); } void @@ -392,6 +404,9 @@ namespace Slicer { Slice::typeToString(vtype).c_str(), d->scoped().c_str(), d->scoped().c_str()); + + fprintf(cpp, "templateMODELPARTFOR(%s, ModelPartForDictionary);\n\n", + d->scoped().c_str()); } void |