diff options
Diffstat (limited to 'src/yarray.hpp')
-rw-r--r-- | src/yarray.hpp | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/src/yarray.hpp b/src/yarray.hpp new file mode 100644 index 0000000..8c79b99 --- /dev/null +++ b/src/yarray.hpp @@ -0,0 +1,110 @@ +/* + Copyright (c) 2007-2010 iMatix Corporation + + This file is part of 0MQ. + + 0MQ is free software; you can redistribute it and/or modify it under + the terms of the Lesser GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + 0MQ is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + Lesser GNU General Public License for more details. + + You should have received a copy of the Lesser GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#ifndef __ZMQ_YARRAY_INCLUDED__ +#define __ZMQ_YARRAY_INCLUDED__ + +#include <vector> +#include <algorithm> + +namespace zmq +{ + + // Fast array implementation with O(1) access to item, insertion and + // removal. Yarray stores pointers rather than objects. The objects have + // to be derived from yarray_item_t class. + + template <typename T> class yarray_t + { + public: + + typedef typename std::vector <T*>::size_type size_type; + + inline yarray_t () + { + } + + inline ~yarray_t () + { + } + + inline size_type size () + { + return items.size (); + } + + inline bool empty () + { + return items.empty (); + } + + inline T *&operator [] (size_type index_) + { + return items [index_]; + } + + inline void push_back (T *item_) + { + if (item_) + item_->set_yarray_index (items.size ()); + items.push_back (item_); + } + + inline void erase (T *item_) { + erase (item_->get_yarray_index ()); + } + + inline void erase (size_type index_) { + if (items.back ()) + items.back ()->set_yarray_index (index_); + items [index_] = items.back (); + items.pop_back (); + } + + inline void swap (size_type index1_, size_type index2_) + { + if (items [index1_]) + items [index1_]->set_yarray_index (index2_); + if (items [index2_]) + items [index2_]->set_yarray_index (index1_); + std::swap (items [index1_], items [index2_]); + } + + inline void clear () + { + items.clear (); + } + + inline size_type index (T *item_) + { + return (size_type) item_->get_yarray_index (); + } + + private: + + typedef std::vector <T*> items_t; + items_t items; + + yarray_t (const yarray_t&); + void operator = (const yarray_t&); + }; + +} + +#endif |