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

// Adlib/misc.h
// (C) Copyright KUBO,Yotaro.
// [バージョン履歴]
// 0.4.7
//   - 前バージョンのテンプレートパラメータの改悪を元に戻す
//   - IncludeGuardマクロ名の変更]


/** \file misc
 *   何処に置いていいか迷ったものはここで宣言しています
 */

#include "classes.h"

#include "DefaultTraits.h"

namespace MiX{
  /**
   * ノードのタイプを表す列挙型です
   *
   * 上位4ビット = 0,[IsNodeContainer],[IsNamedNode],[IsValue]
   * 下位4ビットはユニークな値
   */
  enum NodeType{
    Node_Document = 0x40,
    Node_Element = 0x60,
    Node_Attribute = 0x30,
    Node_Text = 0x10,
    Node_Comment = 0x11,
    //以下の値は実際のノードには使用されない。
    Node_NodeContainer = 0x40,
    Node_NamedNode = 0x20,
    Node_Value = 0x10,
  };
  
  ///エラータイプを表す列挙型です
  enum ErrorType{
    // for ParsingException
    UnexpectedToken = 0,
    XMLDeclarationNotFound,
    InternalError,
    UnexpectedEOD,
    InvalidHandler,
    InvalidDeclaration,
    MismatchTag,
    // for DomException
    NullException,
    NodeNotFound,
    NodeDuplication,
    InvalidNodeFound
  };

  /// toStringなどで利用する文字列に指定数だけtabを追加する関数です
  template<class charT,class traitsT>
  void insertIndent(int i,XMLString<charT,traitsT>& str,charT c){
    for(int j=0;j<i;j++) str+=c;
  }


#define MiX_Template_Typedef(C,T,X) typedef C char_type; \
    typedef T char_traits_type; \
    typedef X xml_traits_type; \
    typedef Node<C,T,X> node_type; \
    typedef NodeContainer<C,T,X> nodecontainer_type; \
    typedef NamedNode<C,T,X> namednode_type; \
    typedef Value<C,T,X> value_type; \
    typedef Document<C,T,X> document_type; \
    typedef Element<C,T,X> element_type; \
    typedef Attribute<C,T,X> attribute_type; \
    typedef Text<C,T,X> text_type; \
    typedef Comment<C,T,X> comment_type; \
    typedef AttrMap<C,T,X> attrmap_type; \
    typedef XMLString<C,T,X> string_type; \
    typedef NodeList<C,T,X> nodelist_type; \
    typedef DOM_Exception<C,T,X> dom_exception_type
}

#endif
