/*=========================================================================
 * Copyright (c) 2002-2014 Pivotal Software, Inc. All Rights Reserved.
 * This product is protected by U.S. and international copyright
 * and intellectual property laws. Pivotal products are covered by
 * more patents listed at http://www.pivotal.io/patents.
 *=========================================================================
 */

#ifndef _GFAS_CPPINPUTPARSER_HPP_
#define _GFAS_CPPINPUTPARSER_HPP_

#include "../../InputParser.hpp"
#include "CPPLexer.hpp"
#include "CPPParser.hpp"

namespace gemfire
{
  namespace pdx_auto_serializer
  {
    class CPPHeaderParser;

    /**
     * This class implements <code>ClassInfo</code> interface for C++.
     */
    class CPPClassInfo: public ClassInfo
    {
    public:
      // ClassInfo implementations

      virtual std::string getName() const;

      virtual void getReferences(ReferenceVector& references) const;

      virtual void getTypeInfo(TypeInfo& classType) const;

      virtual void getMembers(VariableVector& members) const;

      // Setter methods for various fields.

      void setHeaderName(const std::string headerName);

      void setClassName(const std::string className);

      void addMember(const VariableInfo& member);

      void addNamespace(std::vector<std::string>& inNamespaceVector);

      /** Default constructor. */
      CPPClassInfo();

      /** Virtual destructor. */
      virtual ~CPPClassInfo();  

	  void setMethodPrefix(const std::string className);
	  virtual std::string getMethodPrefix() const;

    private:
      /** The name of the header file containing this class. */
      std::string m_headerName;

      /** The name of the class. */
      std::string m_className;

      /** Vector of the members of the class. */
      VariableVector m_members;

      std::vector<std::string> m_NamespacesList;

	  std::string m_method_prefix;

      friend class CPPHeaderParser;
      friend class CPPInputParser;
    };

    /** This class parses the classes from header files. */
    class CPPHeaderParser: public CPPParser
    {
    public:
      /**
       * Construct the object using the given <code>CPPLexer</code>.
       *
       * @param lexer The <code>CPPLexer</code> used as the tokenizer.
       * @param classes The global classes map to be populated.
       * @param selectAll True to mark all the classes as selected.
       */
      CPPHeaderParser(CPPLexer& lexer, ASClassFlagMap& classes,
                      const bool selectAll);

      // CPPParser overrides

      virtual void beginClassDefinition(TypeSpecifier ts, const char* tag);

	  virtual void exitNamespaceScope();

      virtual void endClassDefinition();

      virtual void declaratorID(const char* id, QualifiedItem item);

      virtual void declarationSpecifier(bool td, bool fd, StorageClass sc,
                                        TypeQualifier tq, TypeSpecifier ts,
                                        FunctionSpecifier fs);

      virtual void gfArraySize(const char* id);

      virtual void gfArrayElemSize(const char* id);

    private:
      /** Accumulates the classes as the classes are parsed. */
      ASClassFlagMap& m_classes;

      /** True to mark all the classes as selected. */
      const bool m_selectAll;

      /** Stores the current class being parsed. */
      std::vector<CPPClassInfo*> m_currentClassesVector;

      /** The scope of the current class. */
      int m_currentClassScope;

      /** True when the current field has to be excluded. */
      bool m_currentInclude;

      /** True when the current fiels is marked as identify field */
      bool m_markIdentityField;

      bool m_markPdxUnreadField;


      /**
       * If the current field is an array size specification of field 'x',
       * then this stores the name of 'x'.
       */
      std::string m_currentArraySizeRef;

      std::string m_currentArrayElemSizeRef;

      /**
       * The map of all fields that are array sizes for other fields.
       */
      StringMap m_arraySizeRefMap;
      StringMap m_arrayElemSizeRefMap;

      std::vector<std::string> m_namespaceVector;
    };

    /**
     * This class implements <code>InputParser</code> interface for C++.
     */
    class CPPInputParser: public InputParser
    {
    public:
      // InputParser implementations

      virtual void getOptions(OptionMap& options) const;

      virtual void init(PropertyMap& properties);

      virtual void selectClasses(const StringVector& resources,
                                 const StringVector& classNames);

      /**
       * Defines the static function returning an <code>InputParser</code>
       * object, which is registered with <code>InputParserFactory</code>.
       *
       * @return The <code>InputParser</code> object.
       */
      static InputParser* create();

      /** @brief Virtual destructor. */
      virtual ~CPPInputParser();

    private:
      /**
       * Default constructor -- this is not exposed to public which should use
       * the {@link CPPInputParser::create} function.
       */
      CPPInputParser();
    };
  }
}

#endif // _GFAS_CPPINPUTPARSER_HPP_
