Home  · Classes  · Annotated Classes  · Modules  · Members  · Namespaces  · Related Pages

ConstRefVector.h

Go to the documentation of this file.
00001 // --------------------------------------------------------------------------
00002 //                   OpenMS -- Open-Source Mass Spectrometry
00003 // --------------------------------------------------------------------------
00004 // Copyright The OpenMS Team -- Eberhard Karls University Tuebingen,
00005 // ETH Zurich, and Freie Universitaet Berlin 2002-2012.
00006 //
00007 // This software is released under a three-clause BSD license:
00008 //  * Redistributions of source code must retain the above copyright
00009 //    notice, this list of conditions and the following disclaimer.
00010 //  * Redistributions in binary form must reproduce the above copyright
00011 //    notice, this list of conditions and the following disclaimer in the
00012 //    documentation and/or other materials provided with the distribution.
00013 //  * Neither the name of any author or any participating institution
00014 //    may be used to endorse or promote products derived from this software
00015 //    without specific prior written permission.
00016 // For a full list of authors, refer to the file AUTHORS.
00017 // --------------------------------------------------------------------------
00018 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
00019 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00020 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00021 // ARE DISCLAIMED. IN NO EVENT SHALL ANY OF THE AUTHORS OR THE CONTRIBUTING
00022 // INSTITUTIONS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
00023 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
00024 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
00025 // OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
00026 // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
00027 // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
00028 // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00029 //
00030 // --------------------------------------------------------------------------
00031 // $Maintainer: Erhan Kenar $
00032 // $Authors: $
00033 // --------------------------------------------------------------------------
00034 
00035 #ifndef OPENMS_DATASTRUCTURES_CONSTREFVECTOR_H
00036 #define OPENMS_DATASTRUCTURES_CONSTREFVECTOR_H
00037 
00038 #include <OpenMS/config.h>
00039 #include <OpenMS/CONCEPT/Types.h>
00040 #include <OpenMS/KERNEL/ComparatorUtils.h>
00041 
00042 #include <vector>
00043 #include <typeinfo>
00044 #include <algorithm>
00045 
00046 namespace OpenMS
00047 {
00048 
00071   template <typename ContainerT>
00072   class ConstRefVector
00073   {
00074 public:
00075 
00077     template <class ValueT>
00078     class ConstRefVectorConstIterator
00079     {
00080       friend class ConstRefVector;
00081 
00082 public:
00083       typedef ValueT ValueType;
00084       typedef ValueType value_type;
00085       typedef typename std::vector<ValueType *>::difference_type difference_type;
00086       typedef const value_type & reference;
00087       typedef const value_type * pointer;
00088       typedef std::random_access_iterator_tag iterator_category;
00089 
00090       ConstRefVectorConstIterator()
00091       {
00092       }
00093 
00094       ConstRefVectorConstIterator(const typename std::vector<ValueType *> * vec, unsigned int position)
00095       {
00096         vector_ = (typename std::vector<ValueType *> *)vec;
00097         position_ = position;
00098       }
00099 
00100       ConstRefVectorConstIterator(typename std::vector<ValueType *> * vec, unsigned int position)
00101       {
00102         vector_ = vec;
00103         position_ = position;
00104       }
00105 
00106       ConstRefVectorConstIterator(const ConstRefVectorConstIterator & it)
00107       {
00108         vector_ = it.vector_;
00109         position_ = it.position_;
00110       }
00111 
00112       ~ConstRefVectorConstIterator()
00113       {}
00114 
00115       ConstRefVectorConstIterator & operator=(const ConstRefVectorConstIterator & rhs)
00116       {
00117         if (this == &rhs) return *this;
00118 
00119         vector_ = rhs.vector_;
00120         position_ = rhs.position_;
00121 
00122         return *this;
00123       }
00124 
00125       bool operator<(const ConstRefVectorConstIterator & it) const
00126       {
00127         return position_ < it.position_;
00128       }
00129 
00130       bool operator>(const ConstRefVectorConstIterator & it) const
00131       {
00132         return position_ > it.position_;
00133       }
00134 
00135       bool operator<=(const ConstRefVectorConstIterator & it) const
00136       {
00137         return position_ < it.position_ || position_ == it.position_;
00138       }
00139 
00140       bool operator>=(const ConstRefVectorConstIterator & it) const
00141       {
00142         return position_ > it.position_ || position_ == it.position_;
00143       }
00144 
00145       bool operator==(const ConstRefVectorConstIterator & it) const
00146       {
00147         return position_ == it.position_ && vector_ == it.vector_;
00148       }
00149 
00150       bool operator!=(const ConstRefVectorConstIterator & it) const
00151       {
00152         return position_ != it.position_ || vector_ != it.vector_;
00153       }
00154 
00155       ConstRefVectorConstIterator & operator++()
00156       {
00157         position_ += 1;
00158         return *this;
00159       }
00160 
00161       ConstRefVectorConstIterator operator++(int)
00162       {
00163         ConstRefVectorConstIterator tmp(*this);
00164         ++(*this);
00165         return tmp;
00166       }
00167 
00168       ConstRefVectorConstIterator & operator--()
00169       {
00170         position_ -= 1;
00171         return *this;
00172       }
00173 
00174       ConstRefVectorConstIterator operator--(int)
00175       {
00176         ConstRefVectorConstIterator tmp(*this);
00177         --(*this);
00178         return tmp;
00179       }
00180 
00181       ConstRefVectorConstIterator operator-(difference_type n) const
00182       {
00183         ConstRefVectorConstIterator tmp(*this);
00184         tmp.position_ -= n;
00185         return tmp;
00186       }
00187 
00188       ConstRefVectorConstIterator operator+(difference_type n) const
00189       {
00190         ConstRefVectorConstIterator tmp(*this);
00191         tmp.position_ += n;
00192         return tmp;
00193       }
00194 
00195       ConstRefVectorConstIterator & operator+=(difference_type n)
00196       {
00197         position_ += n;
00198         return *this;
00199       }
00200 
00201       ConstRefVectorConstIterator & operator-=(difference_type n)
00202       {
00203         position_ -= n;
00204         return *this;
00205       }
00206 
00207       friend difference_type operator-(const ConstRefVectorConstIterator & i1, const ConstRefVectorConstIterator & i2)
00208       {
00209         return i1.position_ - i2.position_;
00210       }
00211 
00212       friend ConstRefVectorConstIterator operator+(difference_type n, const ConstRefVectorConstIterator & i)
00213       {
00214         ConstRefVectorConstIterator tmp(i);
00215         tmp.position_ += n;
00216         return tmp;
00217       }
00218 
00219       reference operator*()
00220       {
00221         return *((*vector_)[position_]);
00222       }
00223 
00224       pointer operator->()
00225       {
00226         return (*vector_)[position_];
00227       }
00228 
00229       pointer operator->() const
00230       {
00231         return (*vector_)[position_];
00232       }
00233 
00234 protected:
00235 
00236       typename std::vector<ValueType *> * vector_;
00237       unsigned int position_;
00238     };
00239 
00240 
00242     template <class ValueT>
00243     class ConstRefVectorIterator :
00244       public ConstRefVectorConstIterator<ValueT>
00245     {
00246       friend class ConstRefVector;
00247 
00248 public:
00249 
00250       typedef ValueT ValueType;
00251       typedef typename ConstRefVectorConstIterator<ValueType>::value_type & reference;
00252       typedef typename ConstRefVectorConstIterator<ValueType>::value_type * pointer;
00253 
00254       using ConstRefVectorConstIterator<ValueType>::vector_;
00255       using ConstRefVectorConstIterator<ValueType>::position_;
00256 
00257 
00258       ConstRefVectorIterator()
00259       {
00260       }
00261 
00262       ConstRefVectorIterator(typename std::vector<ValueType *> * vec, unsigned int position) :
00263         ConstRefVectorConstIterator<ValueType>(vec, position)
00264       {
00265       }
00266 
00267       ConstRefVectorIterator(const ConstRefVectorIterator<ValueType> & it) :
00268         ConstRefVectorConstIterator<ValueType>(it)
00269       {
00270       }
00271 
00272       ~ConstRefVectorIterator()
00273       {
00274       }
00275 
00276       reference operator*()
00277       {
00278         return *((*vector_)[position_]);
00279       }
00280 
00281       pointer operator->()
00282       {
00283         return (*vector_)[position_];
00284       }
00285 
00286       pointer operator->() const
00287       {
00288         return (*vector_)[position_];
00289       }
00290 
00291       ConstRefVectorIterator & operator++()
00292       {
00293         ConstRefVectorConstIterator<ValueType>::position_ += 1;
00294         return *this;
00295       }
00296 
00297       ConstRefVectorIterator operator++(int)
00298       {
00299         ConstRefVectorIterator tmp(*this);
00300         ++(*this);
00301         return tmp;
00302       }
00303 
00304       ConstRefVectorIterator & operator--()
00305       {
00306         ConstRefVectorConstIterator<ValueType>::position_ -= 1;
00307         return *this;
00308       }
00309 
00310       ConstRefVectorIterator operator--(int)
00311       {
00312         ConstRefVectorIterator tmp(*this);
00313         --(*this);
00314         return tmp;
00315       }
00316 
00317       ConstRefVectorIterator operator-(typename ConstRefVectorIterator::difference_type n) const
00318       {
00319         ConstRefVectorIterator tmp(*this);
00320         tmp.position_ -= n;
00321         return tmp;
00322       }
00323 
00324       ConstRefVectorIterator operator+(typename ConstRefVectorIterator::difference_type n) const
00325       {
00326         ConstRefVectorIterator tmp(*this);
00327         tmp.position_ += n;
00328         return tmp;
00329       }
00330 
00331       friend ConstRefVectorIterator operator+(typename ConstRefVectorIterator::difference_type n, const ConstRefVectorIterator & i)
00332       {
00333         ConstRefVectorIterator tmp(i);
00334         tmp.position_ += n;
00335         return tmp;
00336       }
00337 
00338       ConstRefVectorIterator & operator+=(typename ConstRefVectorIterator::difference_type n)
00339       {
00340         ConstRefVectorConstIterator<ValueType>::position_ += n;
00341         return *this;
00342       }
00343 
00344       ConstRefVectorIterator & operator-=(typename ConstRefVectorIterator::difference_type n)
00345       {
00346         ConstRefVectorConstIterator<ValueType>::position_ -= n;
00347         return *this;
00348       }
00349 
00350       friend void swap(ConstRefVectorIterator & i1, ConstRefVectorIterator & i2)
00351       {
00352         unsigned int tmp = i1.position_;
00353         i1.position_ = i2.position_;
00354         i2.position_ = tmp;
00355       }
00356 
00357     };
00358 
00359 
00361 
00362 
00363     typedef ContainerT ContainerType;
00365     typedef typename ContainerType::value_type ValueType;
00366     typedef ConstRefVectorIterator<const ValueType> Iterator;
00367     typedef ConstRefVectorConstIterator<const ValueType> ConstIterator;
00368     typedef std::reverse_iterator<Iterator> ReverseIterator;
00369     typedef std::reverse_iterator<ConstIterator> ConstReverseIterator;
00371 
00373 
00374     typedef ValueType value_type;
00375     typedef typename ContainerType::size_type size_type;
00376     typedef typename ContainerType::difference_type difference_type;
00377     typedef typename ContainerType::reference reference;
00378     typedef typename ContainerType::const_reference const_reference;
00379     typedef typename ContainerType::pointer pointer;
00380     typedef Iterator iterator;
00381     typedef ConstIterator const_iterator;
00382     typedef ReverseIterator reverse_iterator;
00383     typedef ConstReverseIterator const_reverse_iterator;
00385 
00386 
00388     void push_back(const ValueType & x)
00389     {
00390       const ValueType * element = &x;
00391       vector_.push_back(element);
00392     }
00393 
00395     void pop_back()
00396     {
00397       vector_.pop_back();
00398     }
00399 
00401     size_type size() const
00402     {
00403       return vector_.size();
00404     }
00405 
00407     size_type capacity() const
00408     {
00409       return std::max(vector_.size(), capacity_);
00410     }
00411 
00413     void reserve(size_type n)
00414     {
00415       size_type cap = capacity();
00416 
00417       if (n > cap)
00418       {
00419         vector_.reserve(n);
00420         capacity_ = n;
00421       }
00422     }
00423 
00425     size_type max_size() const
00426     {
00427       return vector_.max_size();
00428     }
00429 
00431     Iterator begin()
00432     {
00433       return Iterator((std::vector<const ValueType *> *) & vector_, (unsigned int)0);
00434     }
00435 
00437     Iterator end()
00438     {
00439       return Iterator((std::vector<const ValueType *> *) & vector_, (unsigned int)(vector_.size()));
00440     }
00441 
00443     ConstIterator begin() const
00444     {
00445       return ConstIterator((const std::vector<const ValueType *> *) & vector_, (unsigned int)0);
00446     }
00447 
00449     ConstIterator end() const
00450     {
00451       return ConstIterator((const std::vector<const ValueType *> *) & vector_, (unsigned int)(vector_.size()));
00452     }
00453 
00455     ReverseIterator rbegin()
00456     {
00457       return ReverseIterator(end());
00458     }
00459 
00461     ReverseIterator rend()
00462     {
00463       return ReverseIterator(begin());
00464     }
00465 
00467     ConstReverseIterator rbegin() const
00468     {
00469       return ConstReverseIterator(end());
00470     }
00471 
00473     ConstReverseIterator rend() const
00474     {
00475       return ConstReverseIterator(begin());
00476     }
00477 
00479     void resize(size_type new_size)
00480     {
00481       vector_.resize(new_size);
00482       capacity_ = vector_.capacity();
00483     }
00484 
00486     void resize(size_type new_size, const ValueType & t)
00487     {
00488       vector_.resize(new_size, &t);
00489       capacity_ = vector_.capacity();
00490     }
00491 
00493     const_reference front() const
00494     {
00495       return *(begin());
00496     }
00497 
00499     const_reference back() const
00500     {
00501       return *(end() - 1);
00502     }
00503 
00505     void clear()
00506     {
00507       vector_.clear();
00508     }
00509 
00511     bool empty() const
00512     {
00513       return vector_.empty();
00514     }
00515 
00517     const_reference operator[](size_type n) const
00518     {
00519       return *(vector_[n]);
00520     }
00521 
00523     bool operator==(const ConstRefVector & array) const
00524     {
00525       if (base_container_ptr_ != array.base_container_ptr_)
00526       {
00527         return false;
00528       }
00529       if (size() != array.size())
00530       {
00531         return false;
00532       }
00533       for (Size i = 0; i < size(); i++)
00534       {
00535         if (typeid(*(vector_[i])) != typeid(*(array.vector_[i])))
00536         {
00537           return false;
00538         }
00539         if (vector_[i]->operator!=(* array.vector_[i]))
00540         {
00541           return false;
00542         }
00543       }
00544       return true;
00545     }
00546 
00548     bool operator!=(const ConstRefVector & array) const
00549     {
00550       return !(operator==(array));
00551     }
00552 
00554     bool operator<(const ConstRefVector & array) const
00555     {
00556       return size() < array.size();
00557     }
00558 
00560     bool operator>(const ConstRefVector & array) const
00561     {
00562       return size() > array.size();
00563     }
00564 
00566     bool operator<=(const ConstRefVector & array) const
00567     {
00568       return operator<(array) || operator==(array);
00569     }
00570 
00572     bool operator>=(const ConstRefVector & array) const
00573     {
00574       return operator>(array) || operator==(array);
00575     }
00576 
00578     void swap(ConstRefVector & array)
00579     {
00580       vector_.swap(array.vector_);
00581     }
00582 
00584     friend void swap(ConstRefVector & a1, ConstRefVector & a2)
00585     {
00586       a1.vector_.swap(a2.vector_);
00587     }
00588 
00590     Iterator insert(Iterator pos, const ValueType & element)
00591     {
00592       const ValueType * pointer = &element;
00593       vector_.insert(vector_.begin() + pos.position_, pointer);
00594       return pos;
00595     }
00596 
00598     void insert(Iterator pos, size_type n, const ValueType & element)
00599     {
00600       const ValueType * pointer;
00601       std::vector<const ValueType *> tmp;
00602       for (size_type i = 0; i < n; i++)
00603       {
00604         pointer = &element;
00605         tmp.push_back(pointer);
00606       }
00607       vector_.insert(vector_.begin() + pos.position_, tmp.begin(), tmp.end());
00608     }
00609 
00611     template <class InputIterator>
00612     void insert(Iterator pos, InputIterator f, InputIterator l)
00613     {
00614       const ValueType * pointer;
00615       std::vector<const ValueType *> tmp;
00616       for (InputIterator it = f; it != l; ++it)
00617       {
00618         pointer = &(*it);
00619         tmp.push_back(pointer);
00620       }
00621       vector_.insert(vector_.begin() + pos.position_, tmp.begin(), tmp.end());
00622     }
00623 
00625     Iterator erase(Iterator pos)
00626     {
00627       vector_.erase(vector_.begin() + pos.position_);
00628       return pos;
00629     }
00630 
00632     Iterator erase(Iterator first, Iterator last)
00633     {
00634       vector_.erase(vector_.begin() + first.position_, vector_.begin() + last.position_);
00635       return first;
00636     }
00637 
00639 
00640 
00641     ConstRefVector() :
00642       capacity_(0),
00643       base_container_ptr_(0)
00644     {
00645     }
00646 
00648     ConstRefVector(size_type n) :
00649       capacity_(0),
00650       base_container_ptr_(0)
00651     {
00652       vector_ = std::vector<const ValueType *>(n);
00653     }
00654 
00656     ConstRefVector(size_type n, const ValueType & element) :
00657       capacity_(0),
00658       base_container_ptr_(0)
00659     {
00660       vector_ = std::vector<const ValueType *>(n, &element);
00661     }
00662 
00664     ConstRefVector(const ConstRefVector & p) :
00665       capacity_(0),
00666       base_container_ptr_(p.base_container_ptr_)
00667     {
00668       const ValueType * element;
00669       for (ConstIterator it = p.begin(); it != p.end(); ++it)
00670       {
00671         element = &(*it);
00672         vector_.push_back(element);
00673       }
00674     }
00675 
00677     template <class InputIterator>
00678     ConstRefVector(InputIterator f, InputIterator l) :
00679       capacity_(0),
00680       base_container_ptr_(0)
00681     {
00682       const ValueType * pointer;
00683       for (InputIterator it = f; it != l; ++it)
00684       {
00685         pointer = &(*it);
00686         vector_.push_back(pointer);
00687       }
00688     }
00689 
00691     ConstRefVector(ContainerType & p) :
00692       capacity_(0),
00693       base_container_ptr_(&p)
00694     {
00695       const ValueType * element;
00696       for (typename ContainerType::iterator it = p.begin(); it != p.end(); ++it)
00697       {
00698         element = &(*it);
00699         vector_.push_back(element);
00700       }
00701     }
00702 
00704     ~ConstRefVector()
00705     {
00706     }
00707 
00709 
00711     ConstRefVector & operator=(const ConstRefVector & rhs)
00712     {
00713       if (this == &rhs) return *this;
00714 
00715       base_container_ptr_ = rhs.base_container_ptr_;
00716       clear();
00717       reserve(rhs.size());
00718       const ValueType * element;
00719       for (ConstIterator it = rhs.begin(); it != rhs.end(); ++it)
00720       {
00721         element = &(*it);
00722         vector_.push_back(element);
00723       }
00724 
00725       return *this;
00726     }
00727 
00729     template <class InputIterator>
00730     void assign(InputIterator f, InputIterator l)
00731     {
00732       clear();
00733       insert(end(), f, l);
00734     }
00735 
00737     void assign(size_type n, const ValueType & x)
00738     {
00739       clear();
00740       insert(end(), n, x);
00741     }
00742 
00751 
00753     void sortByIntensity(bool reverse = false)
00754     {
00755       if (reverse)
00756       {
00757         std::sort(vector_.begin(), vector_.end(), reverseComparator(pointerComparator(typename ValueType::IntensityLess())));
00758       }
00759       else
00760       {
00761         std::sort(vector_.begin(), vector_.end(), pointerComparator(typename ValueType::IntensityLess()));
00762       }
00763     }
00764 
00766     void sortByPosition()
00767     {
00768       std::sort(vector_.begin(), vector_.end(), pointerComparator(typename ValueType::PositionLess()));
00769     }
00770 
00772 
00786     template <typename ComparatorType>
00787     void sortByComparator(ComparatorType const & comparator = ComparatorType())
00788     {
00789       std::sort(vector_.begin(), vector_.end(), pointerComparator(comparator));
00790     }
00791 
00793 
00794     //----------------------------------------------------------------------
00795 
00796 protected:
00797 
00799     std::vector<const ValueType *> vector_;
00801     size_type capacity_;
00803     const ContainerType * base_container_ptr_;
00804   };
00805 
00806 } // namespace OpenMS
00807 
00808 #endif // OPENMS_DATASTRUCTURES_CONSTREFVECTOR_H

OpenMS / TOPP release 1.10.0 Documentation generated on Thu Mar 7 2013 09:42:38 using doxygen 1.7.1