/*****************************************************************************/ /*! * \file cdlist.h * * Author: Clark Barrett * * Created: Wed Feb 12 18:45:26 2003 * *
* * License to use, copy, modify, sell and/or distribute this software * and its documentation for any purpose is hereby granted without * royalty, subject to the terms and conditions defined in the \ref * LICENSE file provided with this distribution. * *
* */ /*****************************************************************************/ #ifndef _cvc3__include__cdlist_h_ #define _cvc3__include__cdlist_h_ #include "context.h" #include namespace CVC3 { /////////////////////////////////////////////////////////////////////////////// // // // Class: CDList (Context Dependent List) // // Author: Clark Barrett // // Created: Wed Feb 12 17:28:25 2003 // // Description: Generic templated class for list which grows monotonically // // over time (if the context is not popped) but must also be // // saved and restored as contexts are pushed and popped. // // // /////////////////////////////////////////////////////////////////////////////// // TODO: more efficient implementation template class CDList :public ContextObj { //! The actual data. /*! Use deque because it doesn't create/destroy data on resize. This pointer is only non-NULL in the master copy. */ std::deque* d_list; // unsigned d_size; virtual ContextObj* makeCopy(ContextMemoryManager* cmm) { return new(cmm) CDList(*this); } virtual void restoreData(ContextObj* data) { d_size = ((CDList*)data)->d_size; while (d_list->size() > d_size) d_list->pop_back(); } virtual void setNull(void) { while (d_list->size()) d_list->pop_back(); d_size = 0; } // Copy constructor (private). Do NOT copy d_list. It's not used // in restore, and it will be deleted in destructor. CDList(const CDList& l): ContextObj(l), d_list(NULL), d_size(l.d_size) { } public: CDList(Context* context) : ContextObj(context), d_size(0) { d_list = new std::deque(); IF_DEBUG(setName("CDList")); } virtual ~CDList() { if(d_list != NULL) delete d_list; } unsigned size() const { return d_size; } bool empty() const { return d_size == 0; } T& push_back(const T& data, int scope = -1) { makeCurrent(scope); d_list->push_back(data); ++d_size; return d_list->back(); } void pop_back() { DebugAssert(isCurrent() && getRestore() && d_size > ((CDList*)getRestore())->d_size, "pop_back precond violated"); d_list->pop_back(); --d_size; } const T& operator[](unsigned i) const { DebugAssert(i < size(), "CDList["+int2string(i)+"]: i < size="+int2string(size())); return (*d_list)[i]; } const T& at(unsigned i) const { DebugAssert(i < size(), "CDList["+int2string(i)+"]: i < size="+int2string(size())); return (*d_list)[i]; } const T& back() const { DebugAssert(size() > 0, "CDList::back(): size="+int2string(size())); return d_list->back(); } typedef typename std::deque::const_iterator const_iterator; const_iterator begin() const { return d_list->begin(); } const_iterator end() const { return begin() + d_size; } }; } #endif