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

#ifndef MIX_NODE_H_
#define MIX_NODE_H_

#include "classes.h"
#include "misc.h"
#include "DefaultXMLTraits.h"

namespace MiX{

  template <class charT,class char_traits,class xml_traits>
  class Node{
  public:
    MiX_Template_Typedef(charT,char_traits,xml_traits);
    typedef typename nodelist_type::iterator nodelist_iter; 
    typedef NamedNode<charT,char_traits,xml_traits> this_type;
    typedef NodeContainer<charT,char_traits,xml_traits> nodecontainer_type;
  private:
    NodeContainer<charT,char_traits,xml_traits>* parent_;
  protected:
    /**
     * コピーコンストラクタ
     *
     * クライアントはこれを呼び出せない。つまりコピーできない。
     */
    Node(const this_type& src){ };
    ///コンストラクタ
    Node(){ parent_ = 0; };
    ///親ノードを設定
    void setParent(nodecontainer_type& parent){ parent_ = &parent; };
  public:
    /// デストラクタ
    virtual ~Node()throw();
    /// 破棄
    virtual void destroy()throw() { delete this; } ;
    /// 親ノードへの参照を得ます(const版)
    const nodecontainer_type& getParent() const;
    /// 親ノードへの参照を得ます
    nodecontainer_type& getParent();
    /// このノードのタイプを得ます
    virtual NodeType getType() const = 0;
    /// このNodeの文字列表現を得ます
    virtual string_type toString(bool indent=false,int indent_off=0)const = 0;
    /// このノードを複製します
    virtual node_type& clone(nodecontainer_type& parent,const nodelist_iter& it) const=0;
    friend class DOM_Parser<charT,char_traits,xml_traits>;
    friend class NodeContainer<charT,char_traits,xml_traits>;
  };
}

#ifndef MIX_NODE_CPP_
#include "Node.cpp"
#endif

#endif
