From f80de9f4107a01ab3a917eddf15eaaf4a1c998a2 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Tue, 18 Sep 2012 10:28:51 +0200 Subject: Add building blocks for multi-index containers --- cutl/container/map-iterator.hxx | 69 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 cutl/container/map-iterator.hxx (limited to 'cutl/container/map-iterator.hxx') diff --git a/cutl/container/map-iterator.hxx b/cutl/container/map-iterator.hxx new file mode 100644 index 0000000..3e84a4f --- /dev/null +++ b/cutl/container/map-iterator.hxx @@ -0,0 +1,69 @@ +// file : cutl/container/map-iterator.hxx +// copyright : Copyright (c) 2009-2012 Code Synthesis Tools CC +// license : MIT; see accompanying LICENSE file + +#ifndef CUTL_CONTAINER_MAP_ITERATOR_HXX +#define CUTL_CONTAINER_MAP_ITERATOR_HXX + +namespace cutl +{ + namespace container + { + // Map iterator adapter that can be used to implement multi-index + // containers, as discussed in the following post: + // + // http://www.codesynthesis.com/~boris/blog/2012/09/11/emulating-boost-multi-index-with-std-containers/ + // + template + struct map_iterator: M::iterator + { + typedef typename M::iterator base_iterator; + typedef typename M::value_type::second_type value_type; + typedef value_type* pointer; + typedef value_type& reference; + + map_iterator () {} + map_iterator (base_iterator i): base_iterator (i) {} + + reference + operator* () const + { + return base_iterator::operator* ().second; + } + + pointer + operator-> () const + { + return &base_iterator::operator-> ()->second; + } + }; + + template + struct map_const_iterator: M::const_iterator + { + typedef typename M::iterator base_iterator; + typedef typename M::const_iterator base_const_iterator; + typedef const typename M::value_type::second_type value_type; + typedef value_type* pointer; + typedef value_type& reference; + + map_const_iterator () {} + map_const_iterator (base_iterator i): base_const_iterator (i) {} + map_const_iterator (base_const_iterator i): base_const_iterator (i) {} + + reference + operator* () const + { + return base_const_iterator::operator* ().second; + } + + pointer + operator-> () const + { + return &base_const_iterator::operator-> ()->second; + } + }; + } +} + +#endif // CUTL_CONTAINER_MAP_ITERATOR_HXX -- cgit v1.1