Program Listing for File PtrSet.h

Program Listing for File PtrSet.h#

Return to documentation for file (src/util/support/PtrSet.h)

#ifndef PTRSET_H
#define PTRSET_H

#include <set>
#include <FunctionObject.h>

class VoidPtrSet : public std::set<void*, std::less<void*> > {};

template <class T>
class PtrSetWrap
{
  VoidPtrSet impl;
 public:
  PtrSetWrap() {}
  PtrSetWrap( const PtrSetWrap<T>& that) : impl(that.impl) {}
  PtrSetWrap<T>& operator = ( const PtrSetWrap<T>& that) { impl = that.impl; return *this; }
  ~PtrSetWrap() {}
  PtrSetWrap<T>* Clone() const { return new PtrSetWrap<T>(*this); }

  class Iterator
  {
    const VoidPtrSet *impl;
    VoidPtrSet::iterator p;
    Iterator( const VoidPtrSet* _impl)
            : impl(_impl) { Reset(); }
    Iterator( const VoidPtrSet* _impl, const VoidPtrSet::iterator _p)
            : impl(_impl), p(_p) {}
   protected:
    T* Current() const {  return (p == impl->end())? 0 : ((T*)*p); }
    T*& Current() {  return ((T*&)*p); }
  public:
    ~Iterator() {}
    Iterator( const Iterator& that)
     : impl(that.impl), p(that.p) {}
    bool operator == (const Iterator& that) const
      { return impl == that.impl && p == that.p; }
    Iterator& operator = (const Iterator& that)
      { impl = that.impl; p = that.p; return *this; }

    void Reset()
    {
      p = (impl->empty()) ? remove_constness(impl->end()) :
                            remove_constness(impl->begin());
    }
    void Advance() { if (p != impl->end()) ++p; }
    void operator ++() { Advance(); }
    void operator ++(int) { Advance(); }
    bool ReachEnd() const { return p == impl->end(); }
    VoidPtrSet::iterator remove_constness(VoidPtrSet::const_iterator itr) const
    {
    #ifdef _MSC_VER
      return const_cast<VoidPtrSet*>(this->impl)->erase(itr, itr);
    #else
      return itr;
    #endif
    }
    friend class PtrSetWrap<T>;
  };
  class const_iterator : public Iterator {
   public:
    const_iterator( const Iterator& that)
     : Iterator(that) {}
    bool operator == (const const_iterator& that) const
      { return Iterator::operator==(that); }

    const_iterator& operator = (const const_iterator& that)
      {
        Iterator::operator=(that);
        return *this;
      }

    T* Current() const {  return Iterator::Current(); }
    T* operator *() const { return Current(); }
  };
  class iterator : public Iterator {
   public:
    iterator( const Iterator& that) : Iterator(that) {}
    bool operator == (const iterator& that) const
      { return Iterator::operator==(that); }

    iterator& operator = (const iterator& that)
      {
        Iterator::operator=(that);
        return *this;
      }

    T*& Current() {  return Iterator::Current(); }
    T*& operator *() { return Current(); }
  };

  const_iterator begin() const { return Iterator(&impl); }
  const_iterator end() const
  {
    return Iterator(&impl, remove_constness(impl.end()));
  }
  const_iterator find(const T* t) const { return Iterator(&impl,impl.find((void*)t)); }
  iterator begin() { return Iterator(&impl); }
  iterator end() { return Iterator(&impl, impl.end()); }
  VoidPtrSet::iterator remove_constness(VoidPtrSet::const_iterator itr) const
  {
    #ifdef _MSC_VER
    return const_cast<PtrSetWrap<T>*>(this)->impl.erase(itr, itr);
    #else
    return itr;
    #endif
  }

  bool IsMember( const T* t) const
           { return impl.find((void*)t) != impl.end(); }

  void insert(T* t) { impl.insert((void*)t); }
  void erase(T* t) {
      VoidPtrSet::const_iterator p = impl.find((void*)t);
      if ( p != impl.end())
         impl.erase(p);
   }
  void operator &= (const PtrSetWrap<T>& that)
    { VoidPtrSet::iterator p = impl.begin();
      while (p != impl.end()) {
         VoidPtrSet::iterator p1 = p;
         ++p;
         if ( that.impl.find(*p1) == that.impl.end())
            impl.erase(p1);
      }
    }
  void operator |= (const PtrSetWrap<T>& that)
    { impl.insert(that.impl.begin(), that.impl.end()); }
  void operator -= (const PtrSetWrap<T>& that)
    { for (VoidPtrSet::iterator p = remove_constness(that.impl.begin());
           p !=  that.impl.end(); ++p) {
         VoidPtrSet::iterator p1 = impl.find(*p);
         if (p1 != impl.end())
           impl.erase(p1);
      }
    }
  void Clear() { impl.clear(); }

  unsigned NumberOfEntries() const { return impl.size(); }
  unsigned size() const { return impl.size(); }

};

template<class T>
class AppendSTLSet : public CollectObject<T>
{
  std::set<T, std::less<T> >& res;
 public:
  AppendSTLSet( std::set<T, std::less<T> >& r) : res(r) {}
  bool operator()(const T& cur)
   {
      if (res.find(cur) != res.end())
          return false;
      res.insert(cur);
      return true;
   }
};
template<class T>
class AppendPtrSet : public CollectObject<T*>
{
  PtrSetWrap<T>& res;
 public:
  AppendPtrSet( PtrSetWrap<T>& r) : res(r) {}
  bool operator()(T* const& cur)
   {
      if (res.IsMember(cur))
          return false;
      res.insert(cur);
      return true;
   }
};


template<class T>
class SelectSTLSet : public RoseSelectObject<T>
{
  std::set<T> res;
 public:
  SelectSTLSet( const std::set<T> r) : res(r) {}
  bool operator()(const T& cur) const
   {
      return (res.find(cur) != res.end());
   }
};
template<class T>
class SelectPtrSet : public RoseSelectObject<T*>
{
  PtrSetWrap<T> res;
 public:
  SelectPtrSet() {}
  SelectPtrSet( const PtrSetWrap<T>& r) : res(r) {}
  typedef typename PtrSetWrap<T>::const_iterator const_iterator;
  const_iterator begin() const { return res.begin(); }
  const_iterator end() const { return res.end(); }

  bool operator()(T* const& cur)  const
   {
      return (res.IsMember(cur));
   }
};
template<class T>
class NotSelectPtrSet : public RoseSelectObject<T*>
{
  PtrSetWrap<T> res;
 public:
  NotSelectPtrSet( const PtrSetWrap<T>& r) : res(r) {}
  bool operator()(T* const& cur)  const
   {
      return !(res.IsMember(cur));
   }
};
#endif