#ifndef SWIG_LIBCORPUS2_TOKEN_I
#define SWIG_LIBCORPUS2_TOKEN_I

%module libcorpustoken
%{
  #include <unicode/unistr.h>
  #include <libcorpus2/token.h>
%}

%include "libcorpuslexeme.i"
%include "libcorpustagset.i"

%include "std_pair.i"
%include "std_string.i"
%include "std_vector.i"

%feature("notabstract") Corpus2::Token;

%rename(__op_eq__) Corpus2::Token::operator==(const Token& other) const;

namespace Corpus2 {
  class Token {
  public:
    Token();
    Token(const UnicodeString& orth, PwrNlp::Whitespace::Enum wa);
    Token* clone() const;
    
    const UnicodeString& orth() const;
    std::string orth_utf8() const;
    void set_orth(const UnicodeString& orth);
    const PwrNlp::Whitespace::Enum& wa() const;
    void set_wa(const PwrNlp::Whitespace::Enum& wa);
    const std::vector<Lexeme>& lexemes() const;
    std::vector<Lexeme>& lexemes();
    void add_lexeme(const Lexeme& lex);
    const Lexeme& get_preferred_lexeme(const Tagset& tagset) const;
    size_t get_preferred_lexeme_index(const Tagset& tagset) const;
    void make_ign(const Tagset& tagset);
    void add_ign(const Tagset& tagset);
    bool operator==(const Token& other) const;
    bool check_duplicate_lexemes() const;
    bool remove_duplicate_lexemes();
    bool has_disamb_lexeme() const;
    int count_disamb_lexemes() const;

    // std::pair<lexeme_filter_iterator, lexeme_filter_iterator> disamb_lexemes() const;
  };
}

using namespace std;
using namespace Corpus2;


#endif /* SWIG_LIBCORPUS2_TOKEN_I */