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 <optional>
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;
47  operator=(ReadViewFwdIter const&) = default;
48 
49  virtual ~ReadViewFwdIter() = default;
50 
52  copy() const = 0;
53 
54  virtual bool
55  equal(ReadViewFwdIter const& impl) const = 0;
56 
57  virtual void
58  increment() = 0;
59 
60  virtual value_type
61  dereference() const = 0;
62 };
63 
64 // A range using type-erased ForwardIterator
65 //
66 template <class ValueType>
68 {
69 public:
71 
72  static_assert(
74  "ReadViewFwdRange move and move assign constructors should be "
75  "noexcept");
76 
77  class iterator
78  {
79  public:
80  using value_type = ValueType;
81 
82  using pointer = value_type const*;
83 
84  using reference = value_type const&;
85 
87 
89 
90  iterator() = default;
91 
92  iterator(iterator const& other);
93  iterator(iterator&& other) noexcept;
94 
95  // Used by the implementation
96  explicit iterator(
97  ReadView const* view,
99 
100  iterator&
101  operator=(iterator const& other);
102 
103  iterator&
104  operator=(iterator&& other) noexcept;
105 
106  bool
107  operator==(iterator const& other) const;
108 
109  bool
110  operator!=(iterator const& other) const;
111 
112  // Can throw
113  reference
114  operator*() const;
115 
116  // Can throw
117  pointer
118  operator->() const;
119 
120  iterator&
121  operator++();
122 
123  iterator
124  operator++(int);
125 
126  private:
127  ReadView const* view_ = nullptr;
130  };
131 
133  static_assert(std::is_nothrow_move_assignable<iterator>{}, "");
134 
135  using const_iterator = iterator;
136 
137  using value_type = ValueType;
138 
139  ReadViewFwdRange() = delete;
140  ReadViewFwdRange(ReadViewFwdRange const&) = default;
142  operator=(ReadViewFwdRange const&) = default;
143 
144  explicit ReadViewFwdRange(ReadView const& view) : view_(&view)
145  {
146  }
147 
148 protected:
149  ReadView const* view_;
150 };
151 
152 } // namespace detail
153 } // namespace ripple
154 
155 #endif
ripple::detail::ReadViewFwdRange
Definition: ReadViewFwdRange.h:67
ripple::detail::ReadViewFwdRange< tx_type >::const_iterator
iterator const_iterator
Definition: ReadViewFwdRange.h:135
ripple::detail::ReadViewFwdRange::iterator::impl_
std::unique_ptr< iter_base > impl_
Definition: ReadViewFwdRange.h:128
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:149
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:127
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:137
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:80
std::is_nothrow_move_assignable
ripple::detail::ReadViewFwdRange::iterator::reference
value_type const & reference
Definition: ReadViewFwdRange.h:84
ripple::ReadView
A view into a ledger.
Definition: ReadView.h:125
ripple
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: RCLCensorshipDetector.h:29
std::ptrdiff_t
ripple::detail::ReadViewFwdRange::iterator::operator==
bool operator==(iterator const &other) const
optional
ripple::detail::ReadViewFwdRange::iterator
Definition: ReadViewFwdRange.h:77
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:144
ripple::detail::ReadViewFwdRange::iterator::pointer
value_type const * pointer
Definition: ReadViewFwdRange.h:82
ripple::detail::ReadViewFwdRange::iterator::cache_
std::optional< value_type > cache_
Definition: ReadViewFwdRange.h:129
ripple::detail::ReadViewFwdIter::copy
virtual std::unique_ptr< ReadViewFwdIter > copy() const =0
ripple::detail::ReadViewFwdIter::increment
virtual void increment()=0