annotate foosdk/sdk/pfc/iterators.h @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #pragma once
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2 #include "ref_counter.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 namespace pfc {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 //! Base class for list nodes. Implemented by list implementers.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 template<typename t_item> class _list_node : public refcounted_object_root {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 typedef _list_node<t_item> t_self;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 template<typename ... arg_t> _list_node(arg_t && ... arg) : m_content( std::forward<arg_t>(arg) ...) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 t_item m_content;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 virtual t_self * prev() throw() {return NULL;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 virtual t_self * next() throw() {return NULL;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 t_self * walk(bool forward) throw() {return forward ? next() : prev();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 template<typename t_item> class const_iterator {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 typedef _list_node<t_item> t_node;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 typedef refcounted_object_ptr_t<t_node> t_nodeptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 typedef const_iterator<t_item> t_self;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 bool is_empty() const throw() {return m_content.is_empty();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 bool is_valid() const throw() {return m_content.is_valid();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 void invalidate() throw() {m_content = NULL;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 void walk(bool forward) throw() {m_content = m_content->walk(forward);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 void prev() throw() {m_content = m_content->prev();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 void next() throw() {m_content = m_content->next();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 //! For internal use / list implementations only! Do not call!
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 t_node* _node() const throw() {return m_content.get_ptr();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 const_iterator() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 const_iterator(t_node* source) : m_content(source) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 const_iterator(t_nodeptr const & source) : m_content(source) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 const_iterator(t_self const & other) : m_content(other.m_content) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 const_iterator(t_self && other) : m_content(std::move(other.m_content)) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 t_self const & operator=(t_self const & other) {m_content = other.m_content; return *this;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 t_self const & operator=(t_self && other) {m_content = std::move(other.m_content); return *this;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 const t_item& operator*() const throw() {return m_content->m_content;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 const t_item* operator->() const throw() {return &m_content->m_content;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 const t_self & operator++() throw() {this->next(); return *this;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 const t_self & operator--() throw() {this->prev(); return *this;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 t_self operator++(int) throw() {t_self old = *this; this->next(); return old;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 t_self operator--(int) throw() {t_self old = *this; this->prev(); return old;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 bool operator==(const t_self & other) const throw() {return this->m_content == other.m_content;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 bool operator!=(const t_self & other) const throw() {return this->m_content != other.m_content;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 // Returns pointer to referenced item - null if iterator isn't valid
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 const t_item* get() const noexcept { return this->m_content.is_valid() ? &this->m_content->m_content : nullptr; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 t_nodeptr m_content;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 template<typename t_item> class iterator : public const_iterator<t_item> {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 typedef const_iterator<t_item> t_selfConst;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 typedef iterator<t_item> t_self;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 typedef _list_node<t_item> t_node;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 typedef refcounted_object_ptr_t<t_node> t_nodeptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 iterator() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 iterator(t_node* source) : t_selfConst(source) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 iterator(t_nodeptr const & source) : t_selfConst(source) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 iterator(t_self const & other) : t_selfConst(other) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 iterator(t_self && other) : t_selfConst(std::move(other)) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 t_self const & operator=(t_self const & other) {this->m_content = other.m_content; return *this;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 t_self const & operator=(t_self && other) {this->m_content = std::move(other.m_content); return *this;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 t_item& operator*() const throw() {return this->m_content->m_content;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 t_item* operator->() const throw() {return &this->m_content->m_content;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 const t_self & operator++() throw() {this->next(); return *this;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 const t_self & operator--() throw() {this->prev(); return *this;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 t_self operator++(int) throw() {t_self old = *this; this->next(); return old;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 t_self operator--(int) throw() {t_self old = *this; this->prev(); return old;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 bool operator==(const t_self & other) const throw() {return this->m_content == other.m_content;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 bool operator!=(const t_self & other) const throw() {return this->m_content != other.m_content;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 // Returns pointer to referenced item - null if iterator isn't valid
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 t_item* get() const noexcept { return this->m_content.is_valid() ? &this->m_content->m_content : nullptr; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 template<typename item_t> class forward_iterator {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 iterator<item_t> m_iter;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 typedef forward_iterator<item_t> self_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 void operator++() { ++m_iter; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 item_t& operator*() const throw() { return *m_iter; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 item_t* operator->() const throw() { return &*m_iter; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 bool operator==(const self_t& other) const { return m_iter == other.m_iter; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 bool operator!=(const self_t& other) const { return m_iter != other.m_iter; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 forward_iterator() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 forward_iterator(iterator<item_t>&& i) : m_iter(std::move(i)) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 template<typename item_t> class forward_const_iterator {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 const_iterator<item_t> m_iter;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 typedef forward_const_iterator<item_t> self_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 void operator++() { ++m_iter; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 const item_t& operator*() const throw() { return *m_iter; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 const item_t* operator->() const throw() { return &*m_iter; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 bool operator==(const self_t& other) const { return m_iter == other.m_iter; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 bool operator!=(const self_t& other) const { return m_iter != other.m_iter; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 forward_const_iterator() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 forward_const_iterator(const_iterator<item_t>&& i) : m_iter(std::move(i)) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 template<typename t_comparator = comparator_default>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 class comparator_list {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 template<typename t_list1, typename t_list2>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 static int compare(const t_list1 & p_list1, const t_list2 & p_list2) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 typename t_list1::const_iterator iter1 = p_list1.first();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 typename t_list2::const_iterator iter2 = p_list2.first();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 for(;;) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 if (iter1.is_empty() && iter2.is_empty()) return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 else if (iter1.is_empty()) return -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 else if (iter2.is_empty()) return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 int state = t_comparator::compare(*iter1,*iter2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 if (state != 0) return state;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 ++iter1; ++iter2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 template<typename t_list1, typename t_list2>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 static bool listEquals(const t_list1 & p_list1, const t_list2 & p_list2) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 typename t_list1::const_iterator iter1 = p_list1.first();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 typename t_list2::const_iterator iter2 = p_list2.first();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 for(;;) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 if (iter1.is_empty() && iter2.is_empty()) return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 else if (iter1.is_empty() || iter2.is_empty()) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 else if (*iter1 != *iter2) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 ++iter1; ++iter2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 template<typename comparator_t = comparator_default>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 class comparator_stdlist {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 template<typename t_list1, typename t_list2>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 static int compare(const t_list1 & p_list1, const t_list2 & p_list2) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 auto iter1 = p_list1.begin();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 auto iter2 = p_list2.begin();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 for(;;) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 const bool end1 = iter1 == p_list1.end();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 const bool end2 = iter2 == p_list2.end();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 if ( end1 && end2 ) return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 else if ( end1 ) return -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 else if ( end2 ) return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 int state = comparator_t::compare(*iter1,*iter2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 if (state != 0) return state;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 ++iter1; ++iter2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 namespace std {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 template<typename item_t>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 struct iterator_traits< pfc::forward_iterator< item_t > > {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 typedef ptrdiff_t difference_type;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 typedef item_t value_type;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 typedef value_type* pointer;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 typedef value_type& reference;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 typedef std::forward_iterator_tag iterator_category;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 template<typename item_t>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 struct iterator_traits< pfc::forward_const_iterator< item_t > > {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 typedef ptrdiff_t difference_type;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 typedef item_t value_type;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195 typedef const value_type* pointer;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 typedef const value_type& reference;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 typedef std::forward_iterator_tag iterator_category;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 }