#ifndef SWIG_LIBWCCL_SENTENCECONTEXT_I
#define SWIG_LIBWCCL_SENTENCECONTEXT_I

%module libcclsentencecontext
%{
  #include <libwccl/sentencecontext.h>
%}

%include "libcorpustoken.i"
%include "libcorpuslexeme.i"
%include "libcorpussentence.i"

%include "libcclposition.i"

%include "std_string.i"
%include "boost_shared_ptr.i"

// %feature("notabstract") Wccl::SentenceContext;

namespace Wccl {
  class SentenceContext {
  public:
    explicit SentenceContext(const boost::shared_ptr<Corpus2::Sentence>& s);

    SentenceContext duplicate() const;
    SentenceContext* clone() const;
    
    Corpus2::Sentence& get_sentence();
    const Corpus2::Sentence& get_sentence() const;

    int size() const;
    int get_position() const;

    bool is_current_inside() const;
    bool is_inside(int abs_pos) const;
    bool is_inside(const Position& pos) const;

    bool is_outside(int abs_pos) const;
    bool is_outside(const Position& pos) const;

    bool validate_range(
      const Position& left,
      const Position& right,
      int& abs_left,
      int& abs_right) const;

    void set_position(int new_position);
    void advance();
    void goto_start();
    
    const Corpus2::Token* at(int abs_pos) const;
    const Corpus2::Token* at(const Position& position) const;
    Corpus2::Token* at(int abs_pos);
    Corpus2::Token* at(const Position& position);
    const Corpus2::Token* current() const;
    Corpus2::Token* current();

    int get_abs_position(const Position& position) const;
    int get_rel_position(const Position& position) const;
    int translate_special_position(int pos) const;
  };
}

%template(SentenceContextSharedPtr) boost::shared_ptr<Wccl::SentenceContext>;

using namespace boost;
using namespace std;
using namespace Wccl;

#endif /* SWIG_LIBWCCL_SENTENCECONTEXT_I */