#define VT_TPL template #define VT vector namespace ft { /********************************************* * CONSTRUCTORS *********************************************/ VT_TPL VT:: vector( const Allocator & alloc ) : _size(0) , _capacity(0) , _mem_ptr(NULL) , _allocator(alloc) { return; } VT_TPL VT:: vector( size_type n, const T & val, const Allocator & alloc ) : _size(0) , _capacity(0) , _mem_ptr(NULL) , _allocator(alloc) { assign(n, val); return; } VT_TPL template VT:: vector(InputIterator first, InputIterator last, const Allocator & alloc) : _size(0) , _capacity(0) , _mem_ptr(NULL) , _allocator(alloc) { assign(first, last); return; } VT_TPL VT:: vector( vector const & src ) { *this = src; return; } /********************************************* * DESTRUCTORS *********************************************/ VT_TPL VT:: ~vector() { return; } /********************************************* * OPERATORS *********************************************/ VT_TPL VT & VT:: operator=( vector const & rhs ) { // Base::operator=(rhs); if ( this != &rhs ) { _size = rhs.size(); } return *this; } //std::ostream & operator<<(std::ostream & o, vector const & rhs) //{ // o << rhs.getFoo(); // return (o); //} /********************************************* * PUBLIC MEMBER FUNCTIONS *********************************************/ /************* * iterators : *************/ // begin ------------------------------------- VT_TPL typename VT::iterator VT:: begin() { return _mem_ptr; } //const_iterator begin() const; // end --------------------------------------- VT_TPL typename VT::iterator VT:: end() { return &_mem_ptr[_size]; } //const_iterator end() const; // rbegin ------------------------------------ //reverse_iterator rbegin(); //const_reverse_iterator rbegin() const; // rend -------------------------------------- //reverse_iterator rend(); //const_reverse_iterator rend() const; /************ * capacity : ************/ // size -------------------------------------- VT_TPL typename VT::size_type VT:: size( ) const { return _size; } // max_size ---------------------------------- //size_type max_size() const; // resize ------------------------------------ //void resize(size_type n, value_type val = value_type()); // capacity ---------------------------------- VT_TPL typename VT::size_type VT:: capacity() const { return _capacity; } // empty ------------------------------------- //bool empty() const; // reserve ----------------------------------- VT_TPL void VT:: reserve( size_type new_cap ) { value_type * tmp_ptr; if (new_cap > _allocator.max_size()) throw std::length_error("reserve: new_cap > max_size"); if (_capacity == _allocator.max_size()) throw std::length_error("reserve: capacity == max_size"); if (new_cap <= _capacity) return ; _capacity = new_cap; tmp_ptr = _allocator.allocate(new_cap); if (_mem_ptr) { // TMP replacing assign(first, last) for (size_type i = 0; i < _size; i++) tmp_ptr[i] = _mem_ptr[i]; // TMP END _destroy(begin(), end()); _allocator.deallocate(_mem_ptr, _capacity); } _mem_ptr = tmp_ptr; } /****************** * element access : ******************/ // operator[] -------------------------------- VT_TPL typename VT::reference VT:: operator[](size_type n) { return _mem_ptr[n]; } //const_reference operator[](size_type n) const; // at ---------------------------------------- //reference at(size_type n); //const_reference at(size_type n) const; // front ------------------------------------- //reference front(); //const_reference front() const; // back -------------------------------------- //reference back(); //const_reference back() const; /************* * modifiers : *************/ // assign ------------------------------------ VT_TPL template typename enable_if< !is_integral::value,void >::type VT:: assign( InputIterator first, InputIterator last) { // TMP std::cout << B_RED "inside assign(first, last) " RESET; // TMP END InputIterator tmp = first; int range; clear(); for (range = 1; tmp != last; range++) tmp++; _size += range; if (_size >= _capacity) reserve(_size); while (first != last) { _allocator.construct(&_mem_ptr[_size], first); first++; } } // VT_TPL typename enable_if< isinteger::value,std::string >::type VT:: //VT_TPL template //typename enable_if< is_integral::value,void >::type VT:: VT_TPL void VT:: assign( size_type n, const T & val ) { // TMP std::cout << B_RED "inside assign(n, val) " RESET; // TMP END if (n > _allocator.max_size()) throw std::length_error("assign: n > max_size"); value_type * tmp_ptr; _destroy(begin(), end()); if (n > _capacity) { _capacity = n; tmp_ptr = _allocator.allocate(n); if (_mem_ptr) _allocator.deallocate(_mem_ptr, _capacity); _mem_ptr = tmp_ptr; } _size = n; while (n) _allocator.construct(&_mem_ptr[--n], val); } // push_back --------------------------------- VT_TPL void VT:: push_back( const value_type & element ) { if (_size >= _capacity) { if (_size == 0) reserve(1); else reserve(std::min(_size * 2, _allocator.max_size())); } _allocator.construct(&_mem_ptr[_size], element); _size++; } // pop_back ---------------------------------- //void pop_back(); // insert ------------------------------------ //iterator insert(iterator position, const value_type& val); //void insert(iterator position, size_type n, const value_type& val); //template // void insert(iterator position, InputIterator first, InputIterator last); // erase ------------------------------------- //iterator erase(iterator position); //iterator erase(iterator first, iterator last); // swap -------------------------------------- //void swap(vector& x); // clear ------------------------------------- VT_TPL void VT:: clear() { _destroy(begin(), end()); _size = 0; } /********************************************* * PRIVATE MEMBER FUNCTIONS *********************************************/ VT_TPL void VT:: _destroy(iterator first, iterator last) { while (first != last) { _allocator.destroy(first); first++; } } /********************************************* * NESTED CLASS *********************************************/ //void vector::Class::function() {} /********************************************* * STATICS *********************************************/ //std::string const vector::_bar = "bar"; } // namespace ft #undef VT #undef VT_TPL