#ifndef CARRAY_HEADER
#define CARRAY_HEADER
//这个程序取材于 Bjarne Stroustrup 的《The C++ Programming Language》,后经过加强和改正。
//作者是:Piboye
#include <iterator>
namespace piboye
{
template<typename T,int n>
class carray
{
char i_data[sizeof(T)*n];
public:
typedef T value_type;
typedef value_type * iterator;
typedef value_type const * const_iterator;
typedef std::reverse_iterator<iterator> reverse_iterator;
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
typedef value_type & reference;
typedef value_type const & const_reference;
typedef value_type * pointer;
typedef value_type const * const_pointer;
typedef ptrdiff_t difference_type;
typedef int size_type;
private:
const_pointer cast()const {return reinterpret_cast<const_pointer>(i_data);}
pointer cast() {return reinterpret_cast<pointer>(i_data);}
public:
//Full Constructor
carray (value_type const &a_1) {
for(int i=0;i<size();++i) {
new (cast()+i) value_type(a_1);
}
}
template<typename T1>
carray (T1 a_iter) {
for(int i=0;i<size();++i) {
new (cast()+i) value_type(*a_iter);
++a_iter;
}
}
carray(carray const & a_1) {
for(int i=0;i<size();++i) {
new (cast()+i) value_type(a_1[i]);
}
}
carray & operator=(carray const & a_1) {
for(int i=0;i<size();++i) {
cast()[i]=a_1[i];
}
return *this;
}
//Destrcutor
~carray() {
delete [] cast();
}
//iterator
iterator begin() {
return cast();
}
iterator end() {
return cast()+size();
}
const_iterator begin() const {
return cast();
}
const_iterator end() const {
return cast()+size();
}
//reverse_iterator
reverse_iterator rbegin() {
return reverse_iterator (cast()+size());
}
reverse_iterator rend() {
return reverse_iterator(cast());
}
const_reverse_iterator rbegin() const {
return const_reverse_iterator (cast()+size());
}
const_reverse_iterator rend() const {
return const_reverse_iterator(cast());
}
value_type & operator[](int a_index) {
return cast()[a_index];
}
value_type const & operator[](int a_index) const {
return cast()[a_index];
}
size_type size() const {
return n;
}
value_type front() const {
return cast()[0];
}
value_type back() const {
return cast()[size()-1];
}
//Following is unsafted;
//Partition Constructor
}; // class carray ended
} // namespace piboye ended
#endif //CARRAY_HEADER