rippled
ReadViewFwdRange.h
1 //------------------------------------------------------------------------------
2 /*
3  This file is part of rippled: https://github.com/ripple/rippled
4  Copyright (c) 2012, 2013 Ripple Labs Inc.
5 
6  Permission to use, copy, modify, and/or distribute this software for any
7  purpose with or without fee is hereby granted, provided that the above
8  copyright notice and this permission notice appear in all copies.
9 
10  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18 //==============================================================================
19 
20 #ifndef RIPPLE_LEDGER_READVIEWFWDRANGE_H_INCLUDED
21 #define RIPPLE_LEDGER_READVIEWFWDRANGE_H_INCLUDED
22 
23 #include <cstddef>
24 #include <iterator>
25 #include <memory>
26 #include <boost/optional.hpp>
27 
28 namespace ripple {
29 
30 class ReadView;
31 
32 namespace detail {
33 
34 // A type-erased ForwardIterator
35 //
36 template <class ValueType>
38 {
39 public:
41 
42  using value_type = ValueType;
43 
44  ReadViewFwdIter() = default;
45  ReadViewFwdIter(ReadViewFwdIter const&) = default;
46  ReadViewFwdIter& operator=(ReadViewFwdIter const&) = default;
47 
48  virtual
49  ~ReadViewFwdIter() = default;
50 
51  virtual
53  copy() const = 0;
54 
55  virtual
56  bool
57  equal (ReadViewFwdIter const& impl) const = 0;
58 
59  virtual
60  void
61  increment() = 0;
62 
63  virtual
65  dereference() const = 0;
66 };
67 
68 // A range using type-erased ForwardIterator
69 //
70 template<class ValueType>
72 {
73 public:
74  using iter_base =
76 
77  static_assert(
79  "ReadViewFwdRange move and move assign constructors should be "
80  "noexcept");
81 
82  class iterator
83  {
84  public:
85  using value_type = ValueType;
86 
87  using pointer = value_type const*;
88 
89  using reference = value_type const&;
90 
91  using difference_type =
93 
94  using iterator_category =
96 
97  iterator() = default;
98 
99  iterator (iterator const& other);
100  iterator (iterator&& other) noexcept;
101 
102  // Used by the implementation
103  explicit
104  iterator (ReadView const* view,
106 
107  iterator&
108  operator= (iterator const& other);
109 
110  iterator&
111  operator= (iterator&& other) noexcept;
112 
113  bool
114  operator== (iterator const& other) const;
115 
116  bool
117  operator!= (iterator const& other) const;
118 
119  // Can throw
120  reference
121  operator*() const;
122 
123  // Can throw
124  pointer
125  operator->() const;
126 
127  iterator&
128  operator++();
129 
130  iterator
131  operator++(int);
132 
133  private:
134  ReadView const* view_ = nullptr;
136  boost::optional<value_type> mutable cache_;
137  };
138 
140  static_assert(std::is_nothrow_move_assignable<iterator>{}, "");
141 
142  using const_iterator = iterator;
143 
144  using value_type = ValueType;
145 
146  ReadViewFwdRange() = delete;
147  ReadViewFwdRange (ReadViewFwdRange const&) = default;
148  ReadViewFwdRange& operator= (ReadViewFwdRange const&) = default;
149 
150  // VFALCO Otherwise causes errors on clang
151 //private:
152 // friend class ReadView;
153 
154  explicit
156  : view_ (&view)
157  {
158  }
159 
160 protected:
161  ReadView const* view_;
162  boost::optional<iterator> mutable end_;
163 };
164 
165 } // detail
166 } // ripple
167 
168 #endif
ripple::detail::ReadViewFwdRange
Definition: ReadViewFwdRange.h:71
ripple::detail::ReadViewFwdRange< tx_type >::const_iterator
iterator const_iterator
Definition: ReadViewFwdRange.h:142
ripple::detail::ReadViewFwdRange::iterator::impl_
std::unique_ptr< iter_base > impl_
Definition: ReadViewFwdRange.h:135
ripple::detail::ReadViewFwdRange::iterator::operator->
pointer operator->() const
ripple::detail::ReadViewFwdRange::iterator::operator*
reference operator*() const
ripple::detail::ReadViewFwdRange::iterator::operator=
iterator & operator=(iterator const &other)
ripple::detail::ReadViewFwdRange::view_
ReadView const * view_
Definition: ReadViewFwdRange.h:161
iterator
ripple::detail::ReadViewFwdRange::operator=
ReadViewFwdRange & operator=(ReadViewFwdRange const &)=default
std::forward_iterator_tag
ripple::detail::ReadViewFwdRange::iterator::view_
ReadView const * view_
Definition: ReadViewFwdRange.h:134
ripple::detail::ReadViewFwdIter::equal
virtual bool equal(ReadViewFwdIter const &impl) const =0
std::is_nothrow_move_constructible
ripple::detail::ReadViewFwdIter::~ReadViewFwdIter
virtual ~ReadViewFwdIter()=default
ripple::detail::ReadViewFwdRange< tx_type >::value_type
tx_type value_type
Definition: ReadViewFwdRange.h:144
ripple::detail::ReadViewFwdRange::iterator::iterator
iterator()=default
ripple::detail::ReadViewFwdRange::iterator::operator!=
bool operator!=(iterator const &other) const
ripple::detail::ReadViewFwdIter::operator=
ReadViewFwdIter & operator=(ReadViewFwdIter const &)=default
cstddef
ripple::detail::ReadViewFwdRange::iterator::operator++
iterator & operator++()
ripple::detail::ReadViewFwdIter::ReadViewFwdIter
ReadViewFwdIter()=default
memory
ripple::detail::ReadViewFwdIter
Definition: ReadViewFwdRange.h:37
ripple::detail::ReadViewFwdRange::iterator::value_type
ValueType value_type
Definition: ReadViewFwdRange.h:85
std::is_nothrow_move_assignable
ripple::detail::ReadViewFwdRange::iterator::reference
value_type const & reference
Definition: ReadViewFwdRange.h:89
ripple::ReadView
A view into a ledger.
Definition: ReadView.h:186
ripple
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: RCLCensorshipDetector.h:29
ripple::detail::ReadViewFwdRange::iterator::cache_
boost::optional< value_type > cache_
Definition: ReadViewFwdRange.h:136
ripple::detail::ReadViewFwdRange::end_
boost::optional< iterator > end_
Definition: ReadViewFwdRange.h:162
std::ptrdiff_t
ripple::detail::ReadViewFwdRange::iterator::operator==
bool operator==(iterator const &other) const
ripple::detail::ReadViewFwdRange::iterator
Definition: ReadViewFwdRange.h:82
ripple::detail::ReadViewFwdRange::ReadViewFwdRange
ReadViewFwdRange()=delete
ripple::detail::ReadViewFwdIter::dereference
virtual value_type dereference() const =0
std::unique_ptr
STL class.
ripple::detail::ReadViewFwdIter::value_type
ValueType value_type
Definition: ReadViewFwdRange.h:42
ripple::detail::ReadViewFwdRange::ReadViewFwdRange
ReadViewFwdRange(ReadView const &view)
Definition: ReadViewFwdRange.h:155
ripple::detail::ReadViewFwdRange::iterator::pointer
value_type const * pointer
Definition: ReadViewFwdRange.h:87
ripple::detail::ReadViewFwdIter::copy
virtual std::unique_ptr< ReadViewFwdIter > copy() const =0
ripple::detail::ReadViewFwdIter::increment
virtual void increment()=0