summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--slicer/slicer/modelPartsTypes.impl.h8
-rw-r--r--slicer/tool/parser.cpp64
2 files changed, 60 insertions, 12 deletions
diff --git a/slicer/slicer/modelPartsTypes.impl.h b/slicer/slicer/modelPartsTypes.impl.h
index ca562a6..b821d06 100644
--- a/slicer/slicer/modelPartsTypes.impl.h
+++ b/slicer/slicer/modelPartsTypes.impl.h
@@ -13,12 +13,6 @@
#include <boost/multi_index_container.hpp>
#include <c++11Helpers.h>
-#ifdef __clang__
-# define FINALVISMODELPARTS DLL_PUBLIC
-#else
-# define FINALVISMODELPARTS
-#endif
-
#define CUSTOMMODELPARTFOR(Type, BaseModelPart, ModelPartType) \
template<> DLL_PUBLIC ModelPartPtr ModelPart::CreateFor<Type>() \
{ \
@@ -56,7 +50,7 @@
{ \
return CreateRootFor(const_cast<Ice::optional<Type> &>(s)); \
} \
- template class FINALVISMODELPARTS BaseModelPart; \
+ template class BaseModelPart; \
template class ModelPartForRoot<Type>; \
template class ModelPartForRoot<Ice::optional<Type>>;
diff --git a/slicer/tool/parser.cpp b/slicer/tool/parser.cpp
index 3d0505a..33f003b 100644
--- a/slicer/tool/parser.cpp
+++ b/slicer/tool/parser.cpp
@@ -14,17 +14,60 @@
namespace fs = std::filesystem;
namespace Slicer {
+ class Count : public Slice::ParserVisitor {
+ public:
+ bool
+ visitClassDefStart(const Slice::ClassDefPtr &) override
+ {
+ classes += 1;
+ return true;
+ }
+ bool
+ visitStructStart(const Slice::StructPtr &) override
+ {
+ structs += 1;
+ return true;
+ }
+ void
+ visitEnum(const Slice::EnumPtr &) override
+ {
+ enums += 1;
+ }
+
+ unsigned int classes {0};
+ unsigned int structs {0};
+ unsigned int enums {0};
+ };
+
class ForwardDeclare : public Slice::ParserVisitor {
public:
- ForwardDeclare(FILE * c) : cpp(c) { }
+ ForwardDeclare(FILE * c, const Count & cnt) : cpp(c), count(cnt) { }
+
bool
- visitModuleStart(const Slice::ModulePtr & m) override
+ visitUnitStart(const Slice::UnitPtr &) override
{
- fprintbf(cpp, "namespace %s {\n", m->name());
+ if (count.enums) {
+ fprintbf(cpp, "#ifdef ICE_CPP11_MAPPING // C++11 mapping\n");
+ fprintbf(
+ cpp, "#define FORWARD_ENUM(name) enum class ICE_CLASS(JAM_DLL_PUBLIC) name : unsigned char;\n");
+ fprintbf(cpp, "#else // C++98 mapping\n");
+ fprintbf(cpp, "#define FORWARD_ENUM(name) enum ICE_CLASS(JAM_DLL_PUBLIC) name;\n");
+ fprintbf(cpp, "#endif\n\n");
+ }
return true;
}
bool
+ visitModuleStart(const Slice::ModulePtr & m) override
+ {
+ if (count.classes || count.structs || count.enums) {
+ fprintbf(cpp, "namespace %s {\n", m->name());
+ return true;
+ }
+ return false;
+ }
+
+ bool
visitClassDefStart(const Slice::ClassDefPtr & c) override
{
fprintbf(cpp, "class ICE_CLASS(JAM_DLL_PUBLIC) %s;\n", c->name());
@@ -39,12 +82,21 @@ namespace Slicer {
};
void
+ visitEnum(const Slice::EnumPtr & e) override
+ {
+ fprintbf(cpp, "FORWARD_ENUM(%s);\n", e->name());
+ };
+
+ void
visitModuleEnd(const Slice::ModulePtr & m) override
{
- fprintbf(cpp, "} // %s\n\n", m->name());
+ if (count.classes || count.structs || count.enums) {
+ fprintbf(cpp, "} // %s\n\n", m->name());
+ }
}
FILE * cpp;
+ const Count & count;
};
template<typename TPtr>
@@ -136,7 +188,9 @@ namespace Slicer {
fprintbf(cpp, "// Begin Slicer code\n\n");
fprintbf(cpp, "#include <%s>\n\n", (headerPrefix / "modelPartsTypes.impl.h").string());
- ForwardDeclare fd {cpp};
+ Count count;
+ u->visit(&count, true);
+ ForwardDeclare fd {cpp, count};
u->visit(&fd, true);
fprintbf(cpp, "#include <%s>\n", fs::path(topLevelFile.filename()).replace_extension(".h").string());