#include <iostream>
#include <boost/utility.hpp>
//#include <boost/noncopyable.hpp>
//#include <boost/assign.hpp>
#include <boost/swap.hpp>
#include <algorithm>
using namespace std;
using namespace boost;
#if 0
//class X:noncopyable
class X
{
X(const X& );
const X& operator=(const X&);
protected:
X(){}
~X(){}
};
class Y: noncopyable{};
class Z:X{};
#endif
#if 0
#define foreach(container,it) \
for(typeof((container).begin()) it = (container).begin();it!=(container).end();++it)
#endif
struct OP{
void operator()(int& v)
{
cout << v << endl;
}
};
#if 0
struct OPStr{
void operator() (string& str)
{
//cout <<str.c_str()<<endl;
//cout << str.c_str() << endl;
}
};
#endif
#if 0
void foo(int& v)
{
cout <<"foo"<<endl;
}
#endif
class point
{
int x, y, z;
public:
explicit point (int a = 0, int b= 0, int c=0):x(a), y(b),z(c){}
void print() const
{
cout << "x = " << x << " y = " << y << " z = " << z << endl;
}
void swap(point& p)
{
std::swap(x, p.x);
std::swap(y, p.y);
std::swap(z, p.z);
cout <<"inner swap" << endl;
}
};
//namespace std
//{
// template<>
void swap(point& x, point& y)
{
x.swap(y);
}
//}
int main()
{
point p1(1,2,3), p2(4,5,6);
cout <<"std::swap"<<endl;
std::swap(p1, p2);
cout <<"boost::swap " << endl;
boost::swap(p1, p2);
#if 0
int a1[10];
int a2[10];
std::fill_n (a1, 10, 5);
std::fill_n (a2, 10, 15);
//boost::swap(a1,a2);
std:swap(a1,a2);
//for_each(a1[0], a1[9], OP());
#endif
// using namespace boost::assign;
#if 0
vector<int> v;
v += 1,2,3,4,5, 6 * 6;
std::for_each(v.begin(), v.end(), OP());
//int n;
//std::for_each(v.begin(), v.end(), foo(n));
//using namespace boost::assign;
///set<string> s;
//s += "cpp", "java", "c#", "python";
//insert(s) ("cpp") ("java") ("c#") ("python");
deque<string> d
push_front (d) () ="cpp", "java", "c#", "python";
// for_each(s.begin(), s.end(), OP());
//for_each(s.begin(), s.end(), OPStr());
#endif
#if 0
//X x;
Y y;
Z z;
//y = z;
#endif
#if 0
X y;
//next statement test the as if copyable
x = y;
#endif
return 0;
}