SundanceSet.hpp
Go to the documentation of this file.
00001 /* @HEADER@ */
00002 // ************************************************************************
00003 // 
00004 //                              Sundance
00005 //                 Copyright (2005) Sandia Corporation
00006 // 
00007 // Copyright (year first published) Sandia Corporation.  Under the terms 
00008 // of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government 
00009 // retains certain rights in this software.
00010 // 
00011 // This library is free software; you can redistribute it and/or modify
00012 // it under the terms of the GNU Lesser General Public License as
00013 // published by the Free Software Foundation; either version 2.1 of the
00014 // License, or (at your option) any later version.
00015 //  
00016 // This library is distributed in the hope that it will be useful, but
00017 // WITHOUT ANY WARRANTY; without even the implied warranty of
00018 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00019 // Lesser General Public License for more details.
00020 //                                                                                 
00021 // You should have received a copy of the GNU Lesser General Public
00022 // License along with this library; if not, write to the Free Software
00023 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
00024 // USA                                                                                
00025 // Questions? Contact Kevin Long (krlong@sandia.gov), 
00026 // Sandia National Laboratories, Livermore, California, USA
00027 // 
00028 // ************************************************************************
00029 /* @HEADER@ */
00030 
00031 #ifndef SUNDANCE_SET_H
00032 #define SUNDANCE_SET_H
00033 
00034 #include "SundanceDefs.hpp"
00035 #include "Teuchos_Array.hpp"
00036 #include <set>
00037 #include <algorithm>
00038 
00039 
00040 
00041 namespace Sundance
00042 {
00043 using namespace Teuchos;
00044 
00045 /** 
00046  * Extension of STL set, adding some nicer syntax 
00047  * and an iostream insertion operator.
00048  */
00049 template<class Key, class Compare = std::less<Key> >
00050 class Set 
00051 {
00052 public:
00053     
00054   typedef typename std::set<Key, Compare>::iterator iterator;
00055   typedef typename std::set<Key, Compare>::const_iterator const_iterator;
00056   typedef typename std::set<Key, Compare>::reverse_iterator reverse_iterator;
00057   typedef typename std::set<Key, Compare>::const_reverse_iterator const_reverse_iterator;
00058 
00059   typedef typename std::set<Key, Compare>::size_type size_type;
00060   typedef typename std::set<Key, Compare>::pointer pointer;
00061   typedef typename std::set<Key, Compare>::const_pointer const_pointer;
00062   typedef typename std::set<Key, Compare>::const_reference const_reference;
00063   typedef typename std::set<Key, Compare>::reference reference;
00064   typedef typename std::set<Key, Compare>::difference_type difference_type;
00065     
00066   /** */
00067   Set() : set_() {;}
00068 
00069   /** */
00070   Set(const std::set<Key>& s) : set_(s) {;}
00071 
00072   /** */
00073   iterator begin() {return set_.begin();}
00074 
00075   /** */
00076   const_iterator begin() const {return set_.begin();}
00077 
00078   /** */
00079   iterator end() {return set_.end();}
00080 
00081   /** */
00082   const_iterator end() const {return set_.end();}
00083 
00084   /** */
00085   reverse_iterator rbegin() {return set_.rbegin();}
00086 
00087   /** */
00088   const_reverse_iterator rbegin() const {return set_.rbegin();}
00089 
00090   /** */
00091   reverse_iterator rend() {return set_.rend();}
00092 
00093   /** */
00094   const_reverse_iterator rend() const {return set_.rend();}
00095 
00096   /** */
00097   std::pair<iterator, bool> insert(const Key& x) {return set_.insert(x);}
00098 
00099   /** */
00100   iterator insert(iterator pos, const Key& x) {return set_.insert(pos,x);}
00101   
00102   /** */
00103   template <typename InputIterator>
00104   void insert(InputIterator first, InputIterator last) {set_.insert(first,last);}
00105 
00106   /** */
00107   void erase(iterator pos) {set_.erase(pos);}
00108 
00109   /** */
00110   void erase(const Key& x) {set_.erase(x);}
00111 
00112   /** */
00113   void erase(iterator first, iterator last) {set_.erase(first, last);}
00114 
00115   /** */
00116   void clear() {set_.clear();}
00117 
00118   /** */
00119   iterator find(const Key& x) {return set_.find(x);}
00120 
00121   /** */
00122   const_iterator find(const Key& x) const {return set_.find(x);}
00123 
00124   /** */
00125   iterator lower_bound(const Key& x) {return set_.lower_bound(x);}
00126 
00127   /** */
00128   const_iterator lower_bound(const Key& x) const {return set_.lower_bound(x);}
00129 
00130   /** */
00131   iterator upper_bound(const Key& x) {return set_.upper_bound(x);}
00132 
00133   /** */
00134   const_iterator upper_bound(const Key& x) const {return set_.upper_bound(x);}
00135 
00136   /** */
00137   std::pair<iterator,iterator> equal_range(const Key& x)
00138     {return set_.equal_range(x);}
00139 
00140   /** */
00141   std::pair<const_iterator,const_iterator> equal_range(const Key& x) const 
00142     {return set_.equal_range(x);}
00143 
00144   /** */
00145   int size() const {return set_.size();}
00146 
00147   /** */
00148   int max_size() const {return set_.max_size();}
00149 
00150   /** */
00151   bool empty() const {return set_.empty();}
00152     
00153   /** */
00154   const std::set<Key, Compare>& set() const {return set_;}
00155     
00156   /** */
00157   std::set<Key, Compare>& set() {return set_;}
00158 
00159   /** Test whether the specified key is present in the set */
00160   bool contains(const Key& key) const {return this->find(key) != this->end();}
00161 
00162   /** Put a new entry in the set */
00163   void put(const Key& key) {insert(key);}
00164 
00165   /** Write into an array */
00166   Array<Key> elements() const ;
00167 
00168   /** */
00169   void elements(Array<Key>& keys) const ;
00170 
00171   /** */
00172   void merge(const Set<Key, Compare>& other);
00173 
00174   /** */
00175   Set<Key, Compare> intersection(const Set<Key, Compare>& other) const ;
00176 
00177   /** */
00178   Set<Key, Compare> setUnion(const Set<Key, Compare>& other) const ;
00179 
00180   /** */
00181   Set<Key, Compare> setDifference(const Set<Key, Compare>& other) const ;
00182 
00183   /** */
00184   std::ostream& toStream(std::ostream& os) const ;
00185 
00186   /** */
00187   std::string toString() const ;
00188 
00189 private:
00190   std::set<Key, Compare> set_;
00191 };
00192 
00193 
00194 template<class Key, class Compare> inline
00195 Array<Key> Set<Key, Compare>::elements() const
00196 {
00197   Array<Key> rtn;
00198 
00199   typename Set<Key, Compare>::const_iterator iter;
00200 
00201   for (iter=this->begin(); iter != this->end(); iter++)
00202   {
00203     rtn.append(*iter);
00204   }
00205   return rtn;
00206 }
00207 
00208 
00209 template<class Key, class Compare> inline
00210 void Set<Key, Compare>::elements(Array<Key>& rtn) const
00211 {
00212   rtn.resize(0);
00213   typename Set<Key, Compare>::const_iterator iter;
00214 
00215   for (iter=this->begin(); iter != this->end(); iter++)
00216   {
00217     rtn.append(*iter);
00218   }
00219 }
00220 
00221 template<class Key, class Compare> inline
00222 void Set<Key, Compare>::merge(const Set<Key, Compare>& other)
00223 {
00224   typename Set<Key, Compare>::const_iterator iter;
00225 
00226   for (iter=other.begin(); iter != other.end(); iter++)
00227   {
00228     put(*iter);
00229   }
00230 }
00231 
00232 template<class Key, class Compare> inline
00233 Set<Key, Compare> Set<Key, Compare>::intersection(const Set<Key, Compare>& other) const
00234 {
00235   Set<Key, Compare> rtn;
00236 
00237   set_intersection(this->begin(), this->end(),
00238     other.begin(), other.end(), 
00239     std::insert_iterator<Set<Key, Compare> >(rtn, rtn.begin())); 
00240   return rtn;
00241 }
00242 
00243 template<class Key, class Compare> inline
00244 Set<Key, Compare> Set<Key, Compare>::setUnion(const Set<Key, Compare>& other) const
00245 {
00246   Set<Key, Compare> rtn;
00247 
00248   set_union(this->begin(), this->end(),
00249     other.begin(), other.end(), 
00250     std::insert_iterator<Set<Key, Compare> >(rtn, rtn.begin())); 
00251   return rtn;
00252 }
00253 
00254 template<class Key, class Compare> inline
00255 Set<Key, Compare> Set<Key, Compare>::setDifference(const Set<Key, Compare>& other) const
00256 {
00257   Set<Key, Compare> rtn;
00258 
00259   set_difference(this->begin(), this->end(),
00260     other.begin(), other.end(), 
00261     std::insert_iterator<Set<Key, Compare> >(rtn, rtn.begin())); 
00262   return rtn;
00263 }
00264 
00265 template<class Key, class Compare> inline
00266 std::ostream& Set<Key, Compare>::toStream(std::ostream& os) const
00267 {
00268   typename Set<Key, Compare>::const_iterator iter;
00269 
00270   int k = 0;
00271   os << "{";
00272   for (iter=this->begin(); iter != this->end(); iter++, k++)
00273   {
00274     os << *iter;
00275     if (k<(this->size()-1)) os << ", ";
00276   }
00277   os << "}";
00278 
00279   return os;
00280 }
00281 
00282 template<class Key, class Compare> inline
00283 string Set<Key, Compare>::toString() const
00284 {
00285   std::ostringstream os;
00286   os << *this;
00287   return os.str();
00288 }
00289 
00290 /** \relates Set Creates a set */
00291 template<class Key> inline
00292 Set<Key> makeSet(const Array<Key>& k)
00293 {
00294   Set<Key> rtn;
00295   for (int i=0; i<k.size(); i++) rtn.put(k[i]);
00296   return rtn;
00297 }
00298 
00299 /** \relates Set Creates a set */
00300 template<class Key> inline
00301 Set<Key> makeSet(const Key& k)
00302 {
00303   Set<Key> rtn;
00304   rtn.put(k);
00305   return rtn;
00306 }
00307 
00308 /** \relates Set Creates a set */
00309 template<class Key> inline
00310 Set<Key> makeSet(const Key& k1, const Key& k2)
00311 {
00312   Set<Key> rtn = makeSet<Key>(k1);
00313   rtn.put(k2);
00314   return rtn;
00315 }
00316 
00317 /** \relates Set Creates a set */
00318 template<class Key> inline
00319 Set<Key> makeSet(const Key& k1, const Key& k2, const Key& k3)
00320 {
00321   Set<Key> rtn = makeSet<Key>(k1, k2);
00322   rtn.put(k3);
00323   return rtn;
00324 }
00325 
00326 /** \relates Set Creates a set */
00327 template<class Key> inline
00328 Set<Key> makeSet(const Key& k1, const Key& k2, const Key& k3, const Key& k4)
00329 {
00330   Set<Key> rtn = makeSet<Key>(k1, k2, k3);
00331   rtn.put(k4);
00332   return rtn;
00333 }
00334 
00335 /** \relates Set Creates a set */
00336 template<class Key> inline
00337 Set<Key> makeSet(const Key& k1, const Key& k2, const Key& k3, const Key& k4,
00338   const Key& k5)
00339 {
00340   Set<Key> rtn = makeSet<Key>(k1, k2, k3, k4);
00341   rtn.put(k5);
00342   return rtn;
00343 }
00344 
00345 /** \relates Set Creates a set */
00346 template<class Key> inline
00347 Set<Key> makeSet(const Key& k1, const Key& k2, const Key& k3, const Key& k4,
00348   const Key& k5, const Key& k6)
00349 {
00350   Set<Key> rtn = makeSet<Key>(k1, k2, k3, k4, k5);
00351   rtn.put(k6);
00352   return rtn;
00353 }
00354 
00355 /** \relates Set Creates a set */
00356 template<class Key> inline
00357 Set<Key> makeSet(const Key& k1, const Key& k2, const Key& k3, const Key& k4,
00358   const Key& k5, const Key& k6, const Key& k7)
00359 {
00360   Set<Key> rtn = makeSet<Key>(k1, k2, k3, k4, k5, k6);
00361   rtn.put(k7);
00362   return rtn;
00363 }
00364 
00365 /** \relates Set Creates a set */
00366 template<class Key> inline
00367 Set<Key> makeSet(const Key& k1, const Key& k2, const Key& k3, const Key& k4,
00368   const Key& k5, const Key& k6, const Key& k7, const Key& k8)
00369 {
00370   Set<Key> rtn = makeSet<Key>(k1, k2, k3, k4, k5, k6, k7);
00371   rtn.put(k8);
00372   return rtn;
00373 }
00374 
00375 
00376 /** \relates Set */
00377 template <typename Key, typename Compare> bool operator==(
00378   const Set<Key, Compare>& L,
00379   const Set<Key, Compare>& R)
00380 {
00381   return L.set() == R.set();
00382 }
00383 
00384 /** \relates Set */
00385 template <typename Key, typename Compare> bool operator!=(
00386   const Set<Key, Compare>& L,
00387   const Set<Key, Compare>& R)
00388 {
00389   return L.set() != R.set();
00390 }
00391 
00392 /** \relates Set */
00393 template <typename Key, typename Compare> bool operator<=(
00394   const Set<Key, Compare>& L,
00395   const Set<Key, Compare>& R)
00396 {
00397   return L.set() <= R.set();
00398 }
00399 
00400 /** \relates Set */
00401 template <typename Key, typename Compare> bool operator<(
00402   const Set<Key, Compare>& L,
00403   const Set<Key, Compare>& R)
00404 {
00405   return L.set() < R.set();
00406 }
00407 
00408 
00409 /** \relates Set */
00410 template <typename Key, typename Compare> bool operator>(
00411   const Set<Key, Compare>& L,
00412   const Set<Key, Compare>& R)
00413 {
00414   return L.set() > R.set();
00415 }
00416 
00417 /** \relates Set */
00418 template <typename Key, typename Compare> bool operator>=(
00419   const Set<Key, Compare>& L,
00420   const Set<Key, Compare>& R)
00421 {
00422   return L.set() >= R.set();
00423 }
00424 
00425 
00426 
00427   
00428 }
00429 
00430 namespace std
00431 {
00432 /** \relates Sundance::Set */
00433 template<class Key, class Compare> inline
00434 ostream& operator<<(std::ostream& os, const Sundance::Set<Key, Compare>& m)
00435 {return m.toStream(os);}
00436 }
00437 
00438 
00439 #endif

Site Contact