// -*- mode: c++ -*-
#ifndef MiX_CLASSES_H_
#define MiX_CLASSES_H_

#include "config.h"
#include <string>

/**
 * MiXで使用するクラスを収める名前空間
 */
namespace MiX{
 
  /**
   * XML文字列に関するデフォルトポリシー
   */
  template <class charT,class char_traits = MiX_DEFAULT_TRAITS<charT> >
  class DefaultXMLTraits;

  /**
   * 文字列を格納するクラス
   */
  template <class charT,class char_traits = MiX_DEFAULT_TRAITS<charT> , 
	    class xml_traits = DefaultXMLTraits<charT,char_traits> >
  class XMLString;
  
  /**
   * Attributeの名前と値を格納するための順序が保存される辞書
   */
  template <class charT,class char_traits = MiX_DEFAULT_TRAITS<charT> , 
	    class xml_traits = DefaultXMLTraits<charT,char_traits> >
  class AttrMap;

  /**
   * SaxParserからのイベント通知を受け取るインタフェース
   */
  template <class charT,class char_traits = MiX_DEFAULT_TRAITS<charT> , 
	    class xml_traits = DefaultXMLTraits<charT,char_traits> >
  class SAX_EventHandler;

  /**
   * Tokenizerが出力するトークンをあらわすクラス (内部利用クラスです)
   */
  template <class charT,class char_traits = MiX_DEFAULT_TRAITS<charT> , 
	    class xml_traits = DefaultXMLTraits<charT,char_traits> >
  class XMLToken;

  /**
   * 内部で利用するトークナイザ
   */
  template <class charT,class char_traits = MiX_DEFAULT_TRAITS<charT> , 
	    class xml_traits = DefaultXMLTraits<charT,char_traits> >
  class Tokenizer;

  /**
   * 与えられた文字列を解析しSAX_EventHandlerに適切なイベントを起こすパーサー
   */
  template <class charT,class char_traits = MiX_DEFAULT_TRAITS<charT> , 
	    class xml_traits = DefaultXMLTraits<charT,char_traits> >
  class SAX_Parser;

  /**
   * Nodeを格納するリスト
   */
  template <class charT,class char_traits = MiX_DEFAULT_TRAITS<charT> , 
	    class xml_traits = DefaultXMLTraits<charT,char_traits> >
  class NodeList;

  /**
   * 与えられた文字列を解析し、ドキュメントツリーを構築するパーサー
   */
  template <class charT,class char_traits = MiX_DEFAULT_TRAITS<charT> , 
	    class xml_traits = DefaultXMLTraits<charT,char_traits> >
  class DOM_Parser;

  /**
   * 全てのNodeの基底クラス
   */
  template <class charT,class char_traits = MiX_DEFAULT_TRAITS<charT> ,  
	    class xml_traits = DefaultXMLTraits<charT,char_traits> >
  class Node;

  /**
   * 子ノードを保持するNodeの基底クラス
   */
  template <class charT,class char_traits = MiX_DEFAULT_TRAITS<charT> , 
	    class xml_traits = DefaultXMLTraits<charT,char_traits> >
  class NodeContainer;

  /**
   * 名前を保持するNodeの基底クラス
   */
  template <class charT,class char_traits = MiX_DEFAULT_TRAITS<charT> ,  
	    class xml_traits = DefaultXMLTraits<charT,char_traits> >
  class NamedNode;

  /**
   * 値を保持するNodeの基底クラス
   */
  template <class charT,class char_traits = MiX_DEFAULT_TRAITS<charT> ,
	    class xml_traits = DefaultXMLTraits<charT,char_traits> >
  class Value;

  /**
   * XMLドキュメント全体を表すクラス
   */
  template <class charT,class char_traits = MiX_DEFAULT_TRAITS<charT> , 
	    class xml_traits = DefaultXMLTraits<charT,char_traits> >  class Document;

  /**
   * XMLドキュメント内のエレメントを表すクラスです
   */
  template <class charT,class char_traits = MiX_DEFAULT_TRAITS<charT> , 
	    class xml_traits = DefaultXMLTraits<charT,char_traits> >
  class Element;

  /**
   * ElementやDocumentの属性を表すクラスです.
   */
  template <class charT,class char_traits = MiX_DEFAULT_TRAITS<charT> ,
	    class xml_traits = DefaultXMLTraits<charT,char_traits> >
  class Attribute;

  /**
   * XMLドキュメント内の文字列をあらわすクラスです
   */
  template <class charT,class char_traits = MiX_DEFAULT_TRAITS<charT> ,
	    class xml_traits = DefaultXMLTraits<charT,char_traits> >
  class Text;

  /**
   * XMLドキュメント内のコメントを表すクラスです
   */
  template <class charT,class char_traits = MiX_DEFAULT_TRAITS<charT> ,
	    class xml_traits = DefaultXMLTraits<charT,char_traits> >
  class Comment;

  /**
   * DOM操作に失敗した時に投げられる例外を表すクラス
   */
  template <class charT,class char_traits = MiX_DEFAULT_TRAITS<charT> ,
	    class xml_traits = DefaultXMLTraits<charT,char_traits> >
  class DOM_Exception;

  /**
   * ノードの名前を検証する関数オブジェクト
   */
  template <class charT,class char_traits = MiX_DEFAULT_TRAITS<charT> ,
	    class xml_traits = DefaultXMLTraits<charT,char_traits> >
  class NodeNameChecker;
  
  /**
   * NodeTypeを検証する関数オブジェクト
   */
  template <class charT,class char_traits = MiX_DEFAULT_TRAITS<charT> ,
	    class xml_traits = DefaultXMLTraits<charT,char_traits> >
  class NodeTypeChecker;

  /**
   * ノードのタイプと名前を検証するプレディケータ
   */
  template <class nodeT>
  class NamedNodeFinder;
  //template <class charT,class char_traits = MiX_DEFAULT_TRAITS<charT> ,
  //class xml_traits = DefaultXMLTraits<charT,char_traits> >
  //class NamedNodeFinder;

  /**
   * DOM/SAX兼用のパージング時の例外を表すクラス
   */
  class ParsingException;  
}

#endif
