#ifndef SWIG_LIBWCCL_OPERATOR_I
#define SWIG_LIBWCCL_OPERATOR_I

%module libccloperator
%{
  #include <libwccl/ops/operator.h>
%}


%include "libcclvalue.i"
%include "libcclsentencecontext.i"
%include "libcclfunctionaloperator.i"

/*
%include "libcclvariables.i"
%include "libcclparsedexpression.i"
*/

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

%feature("notabstract") Wccl::Operator;

%rename(__op_cop__) Wccl::Operator::operator=(const Operator& other);
%rename(__op_fun__) Wccl::Operator::operator()(const SentenceContext& sentence_context);

namespace Wccl {
  template <class T> class Operator : public FunctionalOperator {
  public:
    Operator();
    Operator& operator=(const Operator& other);
/*
    Operator(const boost::shared_ptr<const Function<T> >& body, const Variables& variables);
*/

    Operator(const Operator& other, bool clean = false);

    boost::shared_ptr<const T> operator()(const SentenceContext& sentence_context);
    boost::shared_ptr<const T> apply(const SentenceContext& sentence_context);
    boost::shared_ptr<T> copy_apply(const SentenceContext& sentence_context);
    boost::shared_ptr<const Value> base_apply(const SentenceContext& sc);
    
    Operator clone() const;
    Operator clone_clean() const;
    
    boost::shared_ptr<Operator<T> > clone_ptr() const;
    boost::shared_ptr<Operator<T> > clone_clean_ptr() const;

    std::string to_string(const Corpus2::Tagset& tagset) const;

  protected:
    Operator* clone_internal() const;
    std::ostream& write_to(std::ostream& ostream) const;
  };

  %template (BoolOperator) Operator<Bool>;
  %template (TSetOperator) Operator<TSet>;
  %template (StrSetOperator) Operator<StrSet>;
  %template (PositionOperator) Operator<Position>;

  %template (SharedPtrBoolOperator) boost::shared_ptr<Operator<Bool> >;
  %template (SharedPtrTSetOperator) boost::shared_ptr<Operator<TSet> >;
  %template (SharedPtrStrSetOperator) boost::shared_ptr<Operator<StrSet> >;
  %template (SharedPtrPositionOperator) boost::shared_ptr<Operator<Position> >;
}

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

#endif /* SWIG_LIBWCCL_OPERATOR_I */