// -*- mode: c++ -*-

#ifndef MiX_COMMENT_H_
#define MiX_COMMENT_H_

#include "classes.h"
#include "misc.h"
#include "XMLString.h"
#include "NodeList.h"
#include "Value.h"
#include "extern/noncopyable.hpp"

namespace MiX{

  template <class charT,class char_traits,class xml_traits>
  class Comment : boost::noncopyable,
		  public Value<charT,char_traits,xml_traits>{
  public:
    MiX_Template_Typedef(charT,char_traits,xml_traits);
    typedef Comment<charT,char_traits,xml_traits> this_type;
    typedef NodeContainer<charT,char_traits,xml_traits> nodecontainer_type;
    typedef typename nodelist_type::iterator nodelist_iter; 
  private:
    const static typename nodelist_type::iterator dmy_it;
  protected:
    /**
     * コンストラクタ.
     *
     * Commentのコンストラクタは直接呼べません<br>
     * Comment<...>::createで生成してください
     */
    Comment(const string_type& val) : Value<charT,char_traits,xml_traits>(val) { };
    /**
     * コピーコンストラクタ
     *
     * Commentはコピーできません。
     */
    Comment(const this_type& src){ };

  public:
    ///デストラクタ
    virtual ~Comment()throw() { };
    ///このノードのタイプを得ます
    virtual NodeType getType()const { return Node_Comment; };
    /**
     * 静的にクラスからNodeTypeを得ます
     *
     * 常にNode_Commentを返します
     */
    static NodeType type() { return Node_Comment; } ;
    /**
     * このCommentの文字列表現を得ます
     *
     * bIndentが真なら文字列のiIndentOffsetに指定された数だけ
     * XMLTraits::tab()が戻り値の先頭につきます
     */
    virtual string_type toString(bool is_indent=false,int indent_off=0)const;
    /**
     * このCommentを複製します
     *
     *  \param parent 複製先の親ノード
     *  \param it 挿入する場所(parent.getChilds()内の要素を示すイテレータでなくてはなりません)
     */
    node_type& clone(nodecontainer_type& parent,const nodelist_iter& it = dmy_it) const 
      { return create(getValue(),dynamic_cast<element_type&>(parent),it); }
    /**
     * Commentを生成します
     *
     * <dl>
     *   <dt>str</dt><dd>生成するCommentの値</dd>
     *   <dt>parent</dt><dd>生成するCommentの親エレメント</dd>
     *   <dt>it</dt><dd>挿入する場所parent.getChilds()の要素を示すイテレータでなければなりません</dd>
     * </dl>
     */
    static this_type& create(const string_type& str,element_type& parent,const typename nodelist_type::iterator& it = dmy_it);

    friend class DOM_Parser<charT,char_traits,xml_traits>;

  };
}

#ifndef MiX_COMMENT_CPP_
#include "Comment.cpp"
#endif

#endif
