%module constructor_copy

%copyctor;
%nocopyctor Foo8;
%nocopyctor Bar<double>;

%inline %{
  
struct Foo1 {
  int x;

  Foo1(int _x = 2) : x(_x)
  {
  }  
};

struct Foo2 {
  Foo2() { }
};

struct Foo3 {
  Foo3() { }
  Foo3(const Foo3& ) { }
};

struct Foo4 {
  Foo4() { }
  
protected:
  Foo4(const Foo4& ) { }
};


struct Foo4a {
  Foo4a() { }
  
private:
  Foo4a(const Foo4a& ) { }
};


struct Foo5 : Foo4 {
};

struct Foo6 : Foo4 {
  Foo6(const Foo6& f) : Foo4(f) { }
};

struct Foo7 : Foo5 {
};

struct Foo8 {
};

template <class T>
class Bar 
{
public:
  int x;

  Bar(int _x = 0) : x(_x)
  {
  }
};
%}

%template(Bari) Bar<int>;
%template(Bard) Bar<double>;


#if defined(SWIGJAVA) || defined(SWIGCSHARP) || defined(SWIGUTL)


%include "std_vector.i"

#if defined(SWIGCSHARP)
SWIG_STD_VECTOR_SPECIALIZE_MINIMUM(Flow, Space::Flow)
#endif

#if defined(SWIGJAVA) || defined(SWIGCSHARP) || defined(SWIGPYTHON) || defined(SWIGR) || defined(SWIGOCTAVE) || defined(SWIGRUBY)
#define SWIG_GOOD_VECTOR
%ignore std::vector<Space::Flow>::vector(size_type);
%ignore std::vector<Space::Flow>::resize(size_type);
#endif

#if defined(SWIGTCL) || defined(SWIGPERL)
#define SWIG_GOOD_VECTOR
/* here, for languages with bad declaration */
%ignore std::vector<Space::Flow>::vector(unsigned int);
%ignore std::vector<Space::Flow>::resize(unsigned int);
#endif

%copyctor;

%ignore FlowFlow::FlowFlow;

%inline %{

namespace Space {
class Flow {
public:
  Flow(int i) {}
};


class FlowFlow {
public:
  FlowFlow(int i) {}
};

}

%}

%template (VectFlow) std::vector<Space::Flow>;

#endif


%rename(ABC_Libor_ModelUtils) ABC_Nam::ABC_Libor::ModelUtils;

%copyctor;
%inline %{
  namespace ABC_Nam {
    namespace ABC_Libor {
      struct ModelUtils {};

      template <class T>
      struct ModelUtils_T {};

    }    
  }
%}

%template(ModelUtils_i) ABC_Nam::ABC_Libor::ModelUtils_T<int>;


%rename(Space1Space2_TotalReturnSwap) Space1::Space2::TotalReturnSwap;

%copyctor;

%inline %{
namespace Space1 {
  namespace Space2 {

    class TotalReturnSwap {
    public:
      TotalReturnSwap() {}
    };    

    template <class T>
    class TotalReturnSwap_T {
    public:
      TotalReturnSwap_T() {}
    };    

  }
}
%}

%template(Total_i) Space1::Space2::TotalReturnSwap_T<int>;

