neoGFX
Cross-platform C++ app/game engine
Loading...
Searching...
No Matches
i_container.hpp
Go to the documentation of this file.
1// i_container.hpp
2/*
3 * Copyright (c) 2007 Leigh Johnston.
4 *
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions are
9 * met:
10 *
11 * * Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 *
14 * * Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in the
16 * documentation and/or other materials provided with the distribution.
17 *
18 * * Neither the name of Leigh Johnston nor the names of any
19 * other contributors to this software may be used to endorse or
20 * promote products derived from this software without specific prior
21 * written permission.
22 *
23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
24 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
25 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
26 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
27 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
28 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
29 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
30 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
31 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
32 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
33 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34*/
35
36#pragma once
37
38#include <neolib/neolib.hpp>
39#include <algorithm>
42
43namespace neolib
44{
45 template <typename T, typename ConstIteratorType, typename IteratorType>
47 {
48 protected:
50 public:
51 typedef T value_type;
52 typedef size_t size_type;
53 typedef ConstIteratorType abstract_const_iterator;
54 typedef IteratorType abstract_iterator;
55 public:
56 typedef typename abstract_const_iterator::iterator_wrapper const_iterator;
57 typedef typename abstract_iterator::iterator_wrapper iterator;
58 typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
59 typedef std::reverse_iterator<iterator> reverse_iterator;
60 public:
61 virtual size_type size() const noexcept = 0;
62 virtual size_type max_size() const noexcept = 0;
63 bool empty() const noexcept { return size() == 0; }
64 const_iterator cbegin() const { const_iterator result; return do_begin(result.storage()); }
65 const_iterator begin() const { return cbegin(); }
66 iterator begin() { iterator result; return do_begin(result.storage()); }
67 const_iterator cend() const { const_iterator result; return do_end(result.storage()); }
68 const_iterator end() const { return cend(); }
69 iterator end() { iterator result; return do_end(result.storage()); }
74 const_reverse_iterator rend() const { return crend(); }
76 iterator erase(const abstract_iterator& aPosition) { iterator result; return do_erase(result.storage(), const_iterator(aPosition)); }
77 iterator erase(const abstract_const_iterator& aPosition) { iterator result; return do_erase(result.storage(), aPosition); }
78 iterator erase(const abstract_iterator& aFirst, const abstract_iterator& aLast) { iterator result; return do_erase(result.storage(), const_iterator(aFirst), const_iterator(aLast)); }
79 iterator erase(const abstract_const_iterator& aFirst, const abstract_const_iterator& aLast) { iterator result; return do_erase(result.storage(), aFirst, aLast); }
80 virtual void clear() = 0;
81 virtual void assign(const i_container& aRhs) = 0;
82 public:
84 {
85 assign(aRhs);
86 return *this;
87 }
88 private:
89 virtual abstract_const_iterator* do_begin(void* memory) const = 0;
90 virtual abstract_const_iterator* do_end(void* memory) const = 0;
91 virtual abstract_iterator* do_begin(void* memory) = 0;
92 virtual abstract_iterator* do_end(void* memory) = 0;
93 virtual abstract_iterator* do_erase(void* memory, const abstract_const_iterator& aPosition) = 0;
94 virtual abstract_iterator* do_erase(void* memory, const abstract_const_iterator& aFirst, const abstract_const_iterator& aLast) = 0;
95 };
96
97 template <typename T, typename ConstIteratorType, typename IteratorType>
99 {
100 return lhs.size() == rhs.size() && std::equal(lhs.begin(), lhs.end(), rhs.begin());
101 }
102
103 template <typename T, typename ConstIteratorType, typename IteratorType>
105 {
106 return std::lexicographical_compare_three_way(lhs.begin(), lhs.end(), rhs.begin(), rhs.end());
107 }
108}
virtual size_type max_size() const noexcept=0
iterator erase(const abstract_iterator &aFirst, const abstract_iterator &aLast)
const_reverse_iterator rbegin() const
iterator erase(const abstract_iterator &aPosition)
virtual void clear()=0
const_iterator cend() const
virtual size_type size() const noexcept=0
std::reverse_iterator< iterator > reverse_iterator
reverse_iterator rend()
iterator erase(const abstract_const_iterator &aPosition)
reverse_iterator rbegin()
virtual void assign(const i_container &aRhs)=0
IteratorType abstract_iterator
const_iterator begin() const
abstract_const_iterator::iterator_wrapper const_iterator
bool empty() const noexcept
const_reverse_iterator crbegin() const
const_iterator cbegin() const
abstract_iterator::iterator_wrapper iterator
i_container & operator=(const i_container &aRhs)
ConstIteratorType abstract_const_iterator
std::reverse_iterator< const_iterator > const_reverse_iterator
const_reverse_iterator rend() const
const_iterator end() const
i_container< T, ConstIteratorType, IteratorType > generic_container_type
iterator erase(const abstract_const_iterator &aFirst, const abstract_const_iterator &aLast)
const_reverse_iterator crend() const
std::partial_ordering operator<=>(const i_container< T, ConstIteratorType, IteratorType > &lhs, const i_container< T, ConstIteratorType, IteratorType > &rhs)