/* This file is part of dia2code. It generates code from an UML Dia Diagram. Copyright (C) 2014-2014 Javier O'Hara - Oliver Kellogg This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #ifndef GENERATE_CODE_HPP #define GENERATE_CODE_HPP #include "config.h" #include #include #include "DiaGram.hpp" #include "umlClass.hpp" #include "umlAssoc.hpp" /** * Abstract base class for code generators. */ class GenerateCode { private: DiaGram & dia; ///< Diagram to generate into code std::string license; ///< License file std::string outdir; ///< Output directory std::string file_ext; ///< File extension std::string body_file_ext; ///< Implementation file extension (for languages where body is generated) std::list file; ///< Stack of files generated uint8_t version; ///< Version of language to generate. For C++: 99 = C++99, 11 = C++11 uint8_t indent : 4; ///< Number of spaces for one indentation uint8_t indentlevel : 4; ///< Current indentation level bool overwrite : 1; ///< Overwrite files while generating code bool buildtree : 1; ///< Convert package names to a directory tree bool bOpenBraceOnNewline : 1; ///< Place opening brace on a new line bool oneClassOneHeader : 1; ///< Create separate file for each classifier /** * True if the language handles include package. * If false, include ALL classes inside the package and its children. */ bool handleIncludePackage : 1; bool noLoopSupport : 1; #ifdef ENABLE_CORBA bool isCorba : 1; #endif bool passByReference (umlClass &cl) const; void openOutfile (const std::string & filename, declaration & d); void closeOutfile (); void genDecl (declaration &d, bool forceOpen); public: GenerateCode (DiaGram & diagram, const char * ext, uint8_t version_, bool handleIncludePackage_, bool noLoopSupport_); DiaGram & getDia (); void generate_code (); const char * getFileExt () const; void setFileExt (const char * ext); const char * getBodyFileExt () const; void setBodyFileExt (const char * ext); std::ofstream & getFile (); uint8_t getVersion () const; void setVersion (uint8_t version_); uint32_t getIndent () const; void setIndent (uint8_t spaces); void incIndentLevel (); void decIndentLevel (); const std::string & getLicense () const; void setLicense (const char * lic); const char * getOutdir () const; const std::string * getOutdirS () const; void setOutdir (const char * dir); bool getOverwrite () const; void setOverwrite (bool over); bool getBuildTree () const; void setBuildTree (bool build); bool getOpenBraceOnNewline () const; void setOpenBraceOnNewline (bool newline); bool getOneClass () const; void setOneClass (bool val); void setHandleIncludePackage (bool val); #ifdef ENABLE_CORBA bool getCorba () const; #endif void genClass (const umlClassNode & node); static const char * cppName (std::string name); const char * fqname (const umlClassNode & node, bool use_ref_type) const; virtual const char * visibility (std::string desc, const Visibility & vis) = 0; std::string & spc () const; virtual std::string strPackage (const char * package) const = 0; virtual std::string strPointer (const std::string & type) const = 0; void writeFile (); static const char * comment (const std::string & comment_, const std::string & startFirstLine, const std::string & startOtherLines, const char * endLastLine); virtual void writeLicense () = 0; virtual void writeStartHeader (std::string & name) = 0; virtual void writeEndHeader () = 0; // return true if at least one include has been written. virtual bool writeInclude (const std::list , const umlClassNode * > > & name) = 0; virtual void writeInclude (const char * name) = 0; virtual void writeBeforeInclude (umlClassNode * node); virtual void writeAfterInclude (umlClassNode * node); virtual void writeFunctionComment (const umlOperation & ope) = 0; virtual void writeFunction (const umlClassNode & node, const umlOperation & ope, Visibility & curr_visibility) = 0; virtual void writeFunctionGetSet (const umlClassNode & node, const umlOperation & ope, Visibility & curr_visibility) = 0; virtual void writeComment (const std::string & text) = 0; virtual void writeComment (const char * text) = 0; virtual void writeClassComment (const std::string & com) = 0; virtual void writeClassStart (const umlClassNode & node) = 0; virtual void writeClassEnd () = 0; virtual void writeAttributeComment (const umlAttribute & attr) = 0; virtual void writeAttribute (const umlClassNode & node, const umlAttribute & attr, Visibility & curr_visibility) = 0; virtual void writeNameSpaceStart (const umlClassNode * name) = 0; virtual void writeNameSpaceEnd (const umlClassNode * node) = 0; virtual void writeEnum (const umlClassNode & node) = 0; virtual void writeStruct (const umlClassNode & node) = 0; virtual void writeTypedef (const umlClassNode & node) = 0; virtual void writeAssociation (const umlClassNode & node, const umlassoc & asso, Visibility & curr_visibility) = 0; virtual void writeTemplates ( const std::list > & tmps) = 0; static const char * visibility1 (std::string desc, const Visibility & vis); void writeLicense1 (const char * start, const char * end); void writeFunctionGetSet1 (const umlClassNode & node, const umlOperation & ope, Visibility & curr_visibility); bool writeInclude1 (const std::list , const umlClassNode *> > & name, const char * startIncludeSystem, const char * endIncludeSystem, const char * startIncludeFile, const char * endIncludeFile, bool forceExtExtern); virtual ~GenerateCode (); }; #endif /* vim:set shiftwidth=4 softtabstop=4 expandtab: */