File Coverage

src/panda/protocol/websocket/iterator.h
Criterion Covered Total %
statement 3 25 12.0
branch 1 12 8.3
condition n/a
subroutine n/a
pod n/a
total 4 37 10.8


line stmt bran cond sub pod time code
1             #pragma once
2             #include
3             #include
4              
5             namespace panda { namespace protocol { namespace websocket {
6              
7             using panda::string;
8             using panda::IteratorPair;
9              
10             struct StringPairIterator : std::iterator {
11 0           StringPairIterator () : s1(global_empty), s2(global_empty), i(2) {}
12 0           StringPairIterator (string& str1, string& str2) : s1(str1), s2(str2), i(0) {}
13 0           StringPairIterator (const StringPairIterator& oth) : s1(oth.s1), s2(oth.s2), i(oth.i) {}
14              
15             StringPairIterator& operator= (const StringPairIterator& oth) {
16             s1 = oth.s1;
17             s2 = oth.s2;
18             i = oth.i;
19             return *this;
20             }
21              
22             bool operator== (const StringPairIterator& rhs) const { return i == rhs.i; }
23 0           bool operator!= (const StringPairIterator& rhs) const { return i != rhs.i; }
24              
25 0 0         string& operator* () { return i == 0 ? s1 : s2; }
26             string* operator-> () { return i == 0 ? &s1 : &s2; }
27              
28 0           StringPairIterator& operator++ () { ++i; return *this; }
29             StringPairIterator operator++ (int) { StringPairIterator tmp(*this); operator++(); return tmp; }
30             StringPairIterator& operator-- () { --i; return *this; }
31             StringPairIterator operator-- (int) { StringPairIterator tmp(*this); operator--(); return tmp; }
32              
33 6           StringPairIterator operator+ (ptrdiff_t n) const { auto ret = *this; ret.i += n; return ret; }
34             StringPairIterator operator- (ptrdiff_t n) const { auto ret = *this; ret.i -= n; return ret; }
35              
36             ptrdiff_t operator- (const StringPairIterator& rhs) const { return i - rhs.i; }
37              
38             bool operator< (const StringPairIterator& rhs) const { return i < rhs.i; }
39             bool operator> (const StringPairIterator& rhs) const { return i > rhs.i; }
40             bool operator<= (const StringPairIterator& rhs) const { return i <= rhs.i; }
41             bool operator>= (const StringPairIterator& rhs) const { return i >= rhs.i; }
42              
43             StringPairIterator& operator+= (ptrdiff_t n) { i += n; return *this; }
44             StringPairIterator& operator-= (ptrdiff_t n) { i -= n; return *this; }
45              
46             string& operator[] (size_t idx) { size_t n = idx + i; return n == 0 ? s1 : s2; }
47              
48             void swap (StringPairIterator& rhs) { std::swap(i, rhs.i); }
49              
50             static string global_empty;
51              
52             private:
53             string& s1;
54             string& s2;
55             ptrdiff_t i;
56             };
57              
58             inline StringPairIterator operator+ (ptrdiff_t n, const StringPairIterator& rhs) { auto ret = rhs; ret += n; return ret; }
59              
60             typedef IteratorPair StringPairIteratorPair;
61              
62             inline StringPairIteratorPair make_iterator_pair (string& str1, string& str2) {
63             return StringPairIteratorPair(StringPairIterator(str1, str2), StringPairIterator());
64             }
65              
66 4 50         struct StringPair : StringPairIteratorPair {
67 0           StringPair(string s1, string s2)
68             : StringPairIteratorPair(StringPairIterator(str1, str2), StringPairIterator())
69             , str1(s1)
70 0 0         , str2(s2)
71 0           {}
72              
73             private:
74             string str1;
75             string str2;
76             };
77              
78 0           inline StringPair make_string_pair (const string& str1, const string& str2) {
79 0 0         return StringPair(str1, str2);
    0          
80             }
81              
82             template
83             struct StringChainIterator : std::iterator {
84 0           StringChainIterator (It last, ptrdiff_t n) : s(StringPairIterator::global_empty), it(last), i(n+1) {}
85 0           StringChainIterator (string& str, It first) : s(str), it(first), i(0) {}
86 0           StringChainIterator (const StringChainIterator& oth) : s(oth.s), it(oth.it), i(oth.i) {}
87              
88             StringChainIterator& operator= (const StringChainIterator& oth) {
89             s = oth.s;
90             it = oth.it;
91             i = oth.i;
92             return *this;
93             }
94              
95             template
96             bool operator== (const StringChainIterator& rhs) const { return i == rhs.i; }
97             template
98 0           bool operator!= (const StringChainIterator& rhs) const { return i != rhs.i; }
99              
100 0 0         string& operator* () { return i == 0 ? s : it[i-1]; }
101             string* operator-> () { return i == 0 ? &s : &it[i-1]; }
102              
103 0           StringChainIterator& operator++ () { ++i; return *this; }
104             StringChainIterator operator++ (int) { StringChainIterator tmp(*this); operator++(); return tmp; }
105             StringChainIterator& operator-- () { --i; return *this; }
106             StringChainIterator operator-- (int) { StringChainIterator tmp(*this); operator--(); return tmp; }
107              
108             StringChainIterator operator+ (ptrdiff_t n) const { auto ret = *this; ret.i += n; return ret; }
109             StringChainIterator operator- (ptrdiff_t n) const { auto ret = *this; ret.i -= n; return ret; }
110              
111             ptrdiff_t operator- (const StringChainIterator& rhs) const { return i - rhs.i; }
112              
113             bool operator< (const StringChainIterator& rhs) const { return i < rhs.i; }
114             bool operator> (const StringChainIterator& rhs) const { return i > rhs.i; }
115             bool operator<= (const StringChainIterator& rhs) const { return i <= rhs.i; }
116             bool operator>= (const StringChainIterator& rhs) const { return i >= rhs.i; }
117              
118             StringChainIterator& operator+= (ptrdiff_t n) { i += n; return *this; }
119             StringChainIterator& operator-= (ptrdiff_t n) { i -= n; return *this; }
120              
121             string& operator[] (size_t idx) { size_t n = idx + i; return n == 0 ? s : it[n-1]; }
122              
123             void swap (StringChainIterator& rhs) { std::swap(i, rhs.i); }
124              
125             private:
126             string& s;
127             It it;
128             ptrdiff_t i;
129             };
130              
131             template
132             inline StringChainIterator operator+ (ptrdiff_t n, const StringChainIterator& rhs) { auto ret = rhs; ret += n; return ret; }
133              
134             template
135             using StringChainIteratorPair = IteratorPair, StringChainIterator>;
136              
137             template
138             inline StringChainIteratorPair make_iterator_pair (string& str, Begin first, End last) {
139             return StringChainIteratorPair(StringChainIterator(str, first), StringChainIterator(last, last - first));
140             }
141              
142             template
143 14           struct StringChain : StringChainIteratorPair {
144 0           StringChain(const string& s, Begin begin, End end)
145             : StringChainIteratorPair(StringChainIterator(str, begin), StringChainIterator(end, end - begin))
146 0           , str(s)
147 0           {}
148              
149             private:
150             string str;
151             };
152              
153             template
154 0           inline StringChain make_string_pair (const string& str, Begin begin, End end) {
155 0           return StringChain(str, begin, end);
156             }
157              
158             }}}