diff options
-rw-r--r-- | slicer/slicer/modelPartsTypes.h | 4 | ||||
-rw-r--r-- | slicer/slicer/modelPartsTypes.impl.h | 4 | ||||
-rw-r--r-- | slicer/test/optionals.ice | 2 | ||||
-rw-r--r-- | slicer/tool/parser.cpp | 37 | ||||
-rw-r--r-- | slicer/tool/parser.h | 1 |
5 files changed, 31 insertions, 17 deletions
diff --git a/slicer/slicer/modelPartsTypes.h b/slicer/slicer/modelPartsTypes.h index f159191..a27ad66 100644 --- a/slicer/slicer/modelPartsTypes.h +++ b/slicer/slicer/modelPartsTypes.h @@ -56,7 +56,7 @@ namespace Slicer { static const ModelPartType type; }; - template<typename T, typename M, T M::* MV> + template<typename T, typename MT, typename M, MT M::* MV> class DLL_PUBLIC ModelPartForConverted : public ModelPartForConvertedBase, protected ModelPartModel<T> { public: typedef T element_type; @@ -66,7 +66,7 @@ namespace Slicer { virtual void SetValue(ValueSourcePtr s) override; virtual void GetValue(ValueTargetPtr s) override; }; - + class DLL_PUBLIC ModelPartForOptionalBase : public ModelPart { public: virtual void OnEachChild(const ChildHandler & ch) override; diff --git a/slicer/slicer/modelPartsTypes.impl.h b/slicer/slicer/modelPartsTypes.impl.h index b19f937..fe38863 100644 --- a/slicer/slicer/modelPartsTypes.impl.h +++ b/slicer/slicer/modelPartsTypes.impl.h @@ -150,8 +150,8 @@ namespace Slicer { } // ModelPartForConverted - template<typename T, typename M, T M::* MV> - ModelPartForConverted<T, M, MV>::ModelPartForConverted(T & h) : + template<typename T, typename MT, typename M, MT M::* MV> + ModelPartForConverted<T, MT, M, MV>::ModelPartForConverted(T & h) : ModelPartModel<T>(h) { } diff --git a/slicer/test/optionals.ice b/slicer/test/optionals.ice index 63476ad..720e7c3 100644 --- a/slicer/test/optionals.ice +++ b/slicer/test/optionals.ice @@ -12,6 +12,8 @@ module TestModule { optional(2) ClassType optClass; optional(3) Classes optSeq; optional(4) ClassMap optDict; + [ "slicer:conversion:boost.posix_time.ptime:boost.posix_time.to_iso_extended_string:boost.posix_time.time_from_string:nodeclare" ] + optional(5) string optConverted; }; }; diff --git a/slicer/tool/parser.cpp b/slicer/tool/parser.cpp index c2c98d0..818cd7e 100644 --- a/slicer/tool/parser.cpp +++ b/slicer/tool/parser.cpp @@ -51,11 +51,8 @@ namespace Slicer { } if (!conversions.empty()) { fprintbf(cpp, "template<> DLL_PUBLIC\nvoid\n"); - fprintbf(cpp, "ModelPartForConverted< %s, %s, &%s >::SetValue(ValueSourcePtr vsp)\n", - Slice::typeToString(type), - c->scoped(), - dm->scoped()); - fprintbf(cpp, "{\n"); + createModelPartForConverted(type, c->scoped(), dm); + fprintbf(cpp, "::SetValue(ValueSourcePtr vsp)\n{\n"); for (const auto & conversion : conversions) { fprintbf(cpp, "\tif (auto vspt = dynamic_cast<TValueSource< %s > *>(vsp.get())) {\n", @@ -82,11 +79,8 @@ namespace Slicer { fprintbf(cpp, "}\n\n"); fprintbf(cpp, "template<> DLL_PUBLIC\nvoid\n"); - fprintbf(cpp, "ModelPartForConverted< %s, %s, &%s >::GetValue(ValueTargetPtr vtp)\n", - Slice::typeToString(type), - c->scoped(), - dm->scoped()); - fprintbf(cpp, "{\n"); + createModelPartForConverted(type, c->scoped(), dm); + fprintbf(cpp, "::GetValue(ValueTargetPtr vtp)\n{\n"); for (const auto & conversion : conversions) { fprintbf(cpp, "\tif (auto vtpt = dynamic_cast<TValueTarget< %s > *>(vtp.get())) {\n", @@ -463,14 +457,31 @@ namespace Slicer { } void + Slicer::createModelPartForConverted(const Slice::TypePtr & type, const std::string & container, const Slice::DataMemberPtr & dm) const + { + fprintbf(cpp, "ModelPartForConverted< %s, ", + Slice::typeToString(type)); + if (dm->optional()) { + fprintbf(cpp, "IceUtil::Optional< %s >", + Slice::typeToString(type)); + } + else { + fprintbf(cpp, "%s", + Slice::typeToString(type)); + } + fprintbf(cpp, ", %s, &%s >", + container, + dm->scoped()); + } + + void Slicer::createNewModelPartPtrFor(const Slice::TypePtr & type, const Slice::DataMemberPtr & dm, const Slice::StringList & md) const { auto conversions = getConversions(md); if (dm && !conversions.empty()) { - fprintbf(cpp, "ModelPartForConverted< %s, %s, &%s >", - Slice::typeToString(type), + createModelPartForConverted(type, boost::algorithm::trim_right_copy_if(dm->container()->thisScope(), ispunct), - dm->scoped()); + dm); } else if (auto cmp = metaDataValue("slicer:custommodelpart:", md)) { fprintbf(cpp, "%s", diff --git a/slicer/tool/parser.h b/slicer/tool/parser.h index 9495607..02c7dfe 100644 --- a/slicer/tool/parser.h +++ b/slicer/tool/parser.h @@ -55,6 +55,7 @@ namespace Slicer { virtual void visitModuleEnd(const Slice::ModulePtr & m) override; private: + void createModelPartForConverted(const Slice::TypePtr & type, const std::string & container, const Slice::DataMemberPtr & dm) const; void createNewModelPartPtrFor(const Slice::TypePtr & type, const Slice::DataMemberPtr & dm = Slice::DataMemberPtr(), const Slice::StringList & md = Slice::StringList()) const; std::string getBasicModelPart(const Slice::TypePtr & type) const; void defineMODELPART(const std::string & type, const Slice::TypePtr & stype, const Slice::StringList & metadata) const; |