Repository navigation
Expand file tree
/
Copy pathiterators.cpp
More file actions
130 lines (116 loc) · 3.48 KB
/
Copy pathiterators.cpp
File metadata and controls
130 lines (116 loc) · 3.48 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#include "bdlde.h"
char source();
void sink(char);
// Reduced iterator access bodies: the object instantiations must remain
// analyzable rather than being replaced by pointer-buffer summaries.
struct InputIterator {
char value;
char operator*() const { return value; }
};
struct OutputIterator {
OutputIterator &operator*() { return *this; }
void operator=(char value) { sink(value); } // $ ir
};
namespace BloombergLP {
namespace bdlde {
template <class OUT, class IN>
int Base64Encoder::convert(OUT out, IN begin, IN end) {
*out = *begin;
return 0;
}
template <class OUT, class IN>
int Base64Encoder::convert(OUT out, int *numOut, int *numIn, IN begin, IN end, int limit) {
*out = *begin;
return 0;
}
template <class OUT, class IN>
int Base64Decoder::convert(OUT out, IN begin, IN end) {
*out = *begin;
return 0;
}
template <class OUT, class IN>
int Base64Decoder::convert(OUT out, int *numOut, int *numIn, IN begin, IN end, int limit) {
*out = *begin;
return 0;
}
template <class OUT, class IN>
int HexEncoder::convert(OUT out, IN begin, IN end) {
*out = *begin;
return 0;
}
template <class OUT, class IN>
int HexEncoder::convert(OUT out, int *numOut, int *numIn, IN begin, IN end, int limit) {
*out = *begin;
return 0;
}
template <class OUT, class IN>
int HexDecoder::convert(OUT out, IN begin, IN end) {
*out = *begin;
return 0;
}
template <class OUT, class IN>
int HexDecoder::convert(OUT out, int *numOut, int *numIn, IN begin, IN end, int limit) {
*out = *begin;
return 0;
}
}
}
void iteratorBase64Encoder() {
BloombergLP::bdlde::Base64Encoder converter;
InputIterator begin = {source()}, end = {0};
char shortOutput[4] = {};
converter.convert(shortOutput, begin, end);
sink(shortOutput[0]); // $ ir
int numOut = 0, numIn = 0;
char longOutput[4] = {};
converter.convert(longOutput, &numOut, &numIn, begin, end);
sink(longOutput[0]); // $ ir
}
void iteratorBase64Decoder() {
BloombergLP::bdlde::Base64Decoder converter;
InputIterator begin = {source()}, end = {0};
char shortOutput[4] = {};
converter.convert(shortOutput, begin, end);
sink(shortOutput[0]); // $ ir
int numOut = 0, numIn = 0;
char longOutput[4] = {};
converter.convert(longOutput, &numOut, &numIn, begin, end);
sink(longOutput[0]); // $ ir
}
void iteratorHexEncoder() {
BloombergLP::bdlde::HexEncoder converter;
InputIterator begin = {source()}, end = {0};
char shortOutput[4] = {};
converter.convert(shortOutput, begin, end);
sink(shortOutput[0]); // $ ir
int numOut = 0, numIn = 0;
char longOutput[4] = {};
converter.convert(longOutput, &numOut, &numIn, begin, end);
sink(longOutput[0]); // $ ir
}
void iteratorHexDecoder() {
BloombergLP::bdlde::HexDecoder converter;
InputIterator begin = {source()}, end = {0};
char shortOutput[4] = {};
converter.convert(shortOutput, begin, end);
sink(shortOutput[0]); // $ ir
int numOut = 0, numIn = 0;
char longOutput[4] = {};
converter.convert(longOutput, &numOut, &numIn, begin, end);
sink(longOutput[0]); // $ ir
}
template <class CONVERTER>
void outputIterator() {
CONVERTER converter;
char input[] = {source()};
OutputIterator out;
converter.convert(out, input, input + 1);
int numOut = 0, numIn = 0;
converter.convert(out, &numOut, &numIn, input, input + 1);
}
void testOutputIterators() {
outputIterator<BloombergLP::bdlde::Base64Encoder>();
outputIterator<BloombergLP::bdlde::Base64Decoder>();
outputIterator<BloombergLP::bdlde::HexEncoder>();
outputIterator<BloombergLP::bdlde::HexDecoder>();
}