00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
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 }
00807
00808 #endif // OPENMS_DATASTRUCTURES_CONSTREFVECTOR_H