@@ -9,105 +9,123 @@ class TGeneralIterator {
9
9
std::variant<TColumnsData::TIterator, TOthersData::TIterator> Iterator;
10
10
std::optional<ui32> RemappedKey;
11
11
std::vector<ui32> RemapKeys;
12
+ ui32 RecordIndex = 0 ;
13
+ ui32 KeyIndex = 0 ;
14
+ bool IsValidFlag = false ;
15
+ bool HasValueFlag = false ;
16
+ std::string_view Value;
17
+ bool IsColumnKeyFlag = false ;
18
+
19
+ void InitFromIterator (const TColumnsData::TIterator& iterator) {
20
+ RecordIndex = iterator.GetCurrentRecordIndex ();
21
+ KeyIndex = RemappedKey.value_or (iterator.GetKeyIndex ());
22
+ IsValidFlag = true ;
23
+ HasValueFlag = iterator.HasValue ();
24
+ Value = iterator.GetValue ();
25
+ }
26
+
27
+ void InitFromIterator (const TOthersData::TIterator& iterator) {
28
+ RecordIndex = iterator.GetRecordIndex ();
29
+ KeyIndex = RemapKeys.size () ? RemapKeys[iterator.GetKeyIndex ()] : iterator.GetKeyIndex ();
30
+ IsValidFlag = true ;
31
+ HasValueFlag = iterator.HasValue ();
32
+ Value = iterator.GetValue ();
33
+ }
34
+
35
+ bool Initialize () {
36
+ struct TVisitor {
37
+ private:
38
+ TGeneralIterator& Owner;
39
+ public:
40
+ TVisitor (TGeneralIterator& owner)
41
+ : Owner(owner) {
42
+ }
43
+ bool operator ()(TOthersData::TIterator& iterator) {
44
+ Owner.IsColumnKeyFlag = false ;
45
+ if (iterator.IsValid ()) {
46
+ Owner.InitFromIterator (iterator);
47
+ } else {
48
+ Owner.IsValidFlag = false ;
49
+ }
50
+ return Owner.IsValidFlag ;
51
+ }
52
+ bool operator ()(TColumnsData::TIterator& iterator) {
53
+ Owner.IsColumnKeyFlag = true ;
54
+ if (iterator.IsValid ()) {
55
+ Owner.InitFromIterator (iterator);
56
+ } else {
57
+ Owner.IsValidFlag = false ;
58
+ }
59
+ return Owner.IsValidFlag ;
60
+ }
61
+ };
62
+ return std::visit (TVisitor (*this ), Iterator);
63
+ }
12
64
13
65
public:
14
66
TGeneralIterator (TColumnsData::TIterator&& iterator, const std::optional<ui32> remappedKey = {})
15
67
: Iterator(iterator)
16
68
, RemappedKey(remappedKey) {
69
+ Initialize ();
17
70
}
18
71
TGeneralIterator (TOthersData::TIterator&& iterator, const std::vector<ui32>& remapKeys = {})
19
72
: Iterator(iterator)
20
73
, RemapKeys(remapKeys) {
74
+ Initialize ();
21
75
}
22
76
bool IsColumnKey () const {
23
- struct TVisitor {
24
- bool operator ()(const TOthersData::TIterator& /* iterator*/ ) {
25
- return false ;
26
- }
27
- bool operator ()(const TColumnsData::TIterator& /* iterator*/ ) {
28
- return true ;
29
- }
30
- };
31
- TVisitor visitor;
32
- return std::visit (visitor, Iterator);
77
+ return IsColumnKeyFlag;
33
78
}
34
79
bool Next () {
35
80
struct TVisitor {
81
+ private:
82
+ TGeneralIterator& Owner;
83
+ public:
84
+ TVisitor (TGeneralIterator& owner)
85
+ : Owner(owner)
86
+ {
87
+
88
+ }
36
89
bool operator ()(TOthersData::TIterator& iterator) {
37
- return iterator.Next ();
90
+ if (iterator.Next ()) {
91
+ Owner.InitFromIterator (iterator);
92
+ } else {
93
+ Owner.IsValidFlag = false ;
94
+ }
95
+ return Owner.IsValidFlag ;
38
96
}
39
97
bool operator ()(TColumnsData::TIterator& iterator) {
40
- return iterator.Next ();
98
+ if (iterator.Next ()) {
99
+ Owner.InitFromIterator (iterator);
100
+ } else {
101
+ Owner.IsValidFlag = false ;
102
+ }
103
+ return Owner.IsValidFlag ;
41
104
}
42
105
};
43
- return std::visit (TVisitor (), Iterator);
106
+ return std::visit (TVisitor (* this ), Iterator);
44
107
}
45
108
bool IsValid () const {
46
- struct TVisitor {
47
- bool operator ()(const TOthersData::TIterator& iterator) {
48
- return iterator.IsValid ();
49
- }
50
- bool operator ()(const TColumnsData::TIterator& iterator) {
51
- return iterator.IsValid ();
52
- }
53
- };
54
- return std::visit (TVisitor (), Iterator);
109
+ return IsValidFlag;
55
110
}
56
111
ui32 GetRecordIndex () const {
57
- struct TVisitor {
58
- ui32 operator ()(const TOthersData::TIterator& iterator) {
59
- return iterator.GetRecordIndex ();
60
- }
61
- ui32 operator ()(const TColumnsData::TIterator& iterator) {
62
- return iterator.GetCurrentRecordIndex ();
63
- }
64
- };
65
- return std::visit (TVisitor (), Iterator);
112
+ AFL_VERIFY (IsValidFlag);
113
+ return RecordIndex;
66
114
}
67
115
ui32 GetKeyIndex () const {
68
- struct TVisitor {
69
- private:
70
- const TGeneralIterator& Owner;
71
-
72
- public:
73
- TVisitor (const TGeneralIterator& owner)
74
- : Owner(owner) {
75
- }
76
- ui32 operator ()(const TOthersData::TIterator& iterator) {
77
- return Owner.RemapKeys .size () ? Owner.RemapKeys [iterator.GetKeyIndex ()] : iterator.GetKeyIndex ();
78
- }
79
- ui32 operator ()(const TColumnsData::TIterator& iterator) {
80
- return Owner.RemappedKey .value_or (iterator.GetKeyIndex ());
81
- }
82
- };
83
- return std::visit (TVisitor (*this ), Iterator);
116
+ AFL_VERIFY (IsValidFlag);
117
+ return KeyIndex;
84
118
}
85
119
std::string_view GetValue () const {
86
- struct TVisitor {
87
- std::string_view operator ()(const TOthersData::TIterator& iterator) {
88
- return iterator.GetValue ();
89
- }
90
- std::string_view operator ()(const TColumnsData::TIterator& iterator) {
91
- return iterator.GetValue ();
92
- }
93
- };
94
- return std::visit (TVisitor (), Iterator);
120
+ AFL_VERIFY (IsValidFlag);
121
+ return Value;
95
122
}
96
-
97
123
bool HasValue () const {
98
- struct TVisitor {
99
- bool operator ()(const TOthersData::TIterator& iterator) {
100
- return iterator.HasValue ();
101
- }
102
- bool operator ()(const TColumnsData::TIterator& iterator) {
103
- return iterator.HasValue ();
104
- }
105
- };
106
- return std::visit (TVisitor (), Iterator);
124
+ AFL_VERIFY (IsValidFlag);
125
+ return HasValueFlag;
107
126
}
108
-
109
127
bool operator <(const TGeneralIterator& item) const {
110
- return std::tuple (item.GetRecordIndex () , item.GetKeyIndex ()) < std::tuple ( GetRecordIndex (), GetKeyIndex () );
128
+ return std::tie (item.RecordIndex , item.KeyIndex ) < std::tie (RecordIndex, KeyIndex );
111
129
}
112
130
};
113
131
0 commit comments