eolian-cxx: Fix multiple definitions in forward declaration
authorFelipe Magno de Almeida <felipe@expertisesolutions.com.br>
Wed, 25 Oct 2017 20:00:50 +0000 (18:00 -0200)
committerFelipe Magno de Almeida <felipe@expertisesolutions.com.br>
Wed, 25 Oct 2017 20:03:09 +0000 (18:03 -0200)
src/lib/eolian_cxx/grammar/class_declaration.hpp

index 7c9957f..d448c31 100644 (file)
@@ -21,6 +21,19 @@ struct class_declaration_generator
    bool generate(OutputIterator sink, attributes::klass_def const& cls, Context const& context) const
    {
      std::vector<std::string> cpp_namespaces = attributes::cpp_namespaces(cls.namespaces);
+
+     std::string guard_symbol;
+
+     if(!as_generator(*(string << "_") << string << "_FWD_GUARD")
+        .generate(std::back_inserter(guard_symbol)
+                  , std::make_tuple(cpp_namespaces, cls.cxx_name), add_upper_case_context(context)))
+       return false;
+
+     if(!as_generator(   "#ifndef " << guard_symbol << "\n"
+                      << "#define " << guard_symbol << "\n")
+        .generate(sink, std::make_tuple(), context))
+       return false;
+     
      auto open_namespace = *("namespace " << string << " { ") << "\n";
      if(!as_generator(open_namespace).generate(sink, cpp_namespaces, add_lower_case_context(context))) return false;
 
@@ -32,7 +45,7 @@ struct class_declaration_generator
      auto close_namespace = *(lit("} ")) << "\n";
      if(!as_generator(close_namespace).generate(sink, cpp_namespaces, context)) return false;
 
-     if(type_traits)
+     // if(type_traits)
        if(!as_generator
           (
            "namespace efl { namespace eo { template<> struct is_eolian_object< "
@@ -49,6 +62,10 @@ struct class_declaration_generator
                        , cpp_namespaces, cls.cxx_name, cpp_namespaces, cls.cxx_name
                       ), context)) return false;
 
+     if(!as_generator("#endif\n")
+        .generate(sink, std::make_tuple(), context))
+       return false;
+
      
      return true;
    }