28 #include <type_traits> 29 #include "csl/std_vector_implementation.h" 33 template<
class Pr
intable>
35 void operator()(std::ostream &out, Printable
const &printable) {
40 template<
class Comparable>
42 :
public std::equal_to<std::remove_reference_t<std::remove_cv_t<Comparable>>>
45 template<
class Comparable>
47 bool operator()(Comparable
const &, Comparable
const &)
const {
52 template<
class ValueType,
class Comparator,
class HardComparator,
class Pr
inter>
63 IMPLEMENTS_STD_VECTOR_NO_PB(ValueType, data)
67 static std::vector<size_t> range(
size_t N) {
68 std::vector<size_t> indices(N);
69 for (
size_t i = 0; i != N; ++i)
74 template<
class ...Args>
75 DataList(Args &&...args): data(std::forward<Args>(args)...) {}
77 template<
class t_Comparator,
class t_HardComparator,
class t_Pr
inter>
79 ValueType, t_Comparator, t_HardComparator, t_Printer
84 void push(ValueType
const &value) { data.push_back(value); }
85 void push(ValueType &&value) { data.push_back(value); }
88 bool compare(DataList<
89 ValueType, Comparator, HardComparator, Printer
90 >
const &other)
const;
93 ValueType, Comparator, HardComparator, Printer
96 return compare(other);
102 ValueType, Comparator, HardComparator, Printer
109 ValueType, Comparator, HardComparator, Printer
115 std::vector<ValueType> data;
118 template<
class ValueType,
class Comparator,
class HardComparator,
class Pr
inter>
123 bool empty()
const {
return lhs.empty() && rhs.empty(); }
124 size_t size()
const {
return lhs.size() + rhs.size(); }
127 template<
class ValueType,
class Comparator,
class HardComparator,
class Pr
inter>
133 out <<
"Diff of size " << diff.size() <<
'\n';
136 auto printer = Printer();
137 for (
const auto &data : diff.lhs) {
143 for (
const auto &data : diff.rhs) {
152 template<
class ValueType,
class Comparator,
class HardComparator,
class Pr
inter>
157 if (size() != other.size())
159 std::vector<size_t> indices = range(size());
161 auto comparator = Comparator();
163 while (!indices.empty()) {
164 bool matched =
false;
165 for (
size_t k = 0; k != indices.size(); ++k) {
166 if (comparator(*iter, other[indices[k]])) {
168 indices.erase(indices.begin() + k);
179 template<
class ValueType,
class Comparator,
class HardComparator,
class Pr
inter>
185 std::vector<size_t> indicesLhs = range(size());
186 std::vector<size_t> indicesRhs = range(other.size());
188 auto comparator = Comparator();
190 while (!indicesLhs.empty() && !indicesRhs.empty()) {
191 const size_t i = indicesLhs[0];
192 bool matched =
false;
193 for (
size_t k = 0; k != indicesRhs.size(); ++k) {
194 const size_t j = indicesRhs[k];
195 if (comparator(data[i], other[j])) {
197 indicesRhs.erase(indicesRhs.begin() + k);
202 diff.lhs.push(data[i]);
203 indicesLhs.erase(indicesLhs.begin());
205 if (!indicesLhs.empty()) {
206 for (
size_t i : indicesLhs)
207 diff.lhs.push(data[i]);
209 if (!indicesRhs.empty()) {
210 for (
size_t i : indicesRhs)
211 diff.rhs.push(other[i]);
217 template<
class ValueType,
class Comparator,
class HardComparator,
class Pr
inter>
223 auto diff = getDiff(other);
224 if (diff.lhs.empty() or diff.rhs.empty())
228 ValueType, HardComparator, HardComparator, Printer
230 return HardList(std::move(diff.lhs)).getDiff(HardList(std::move(diff.rhs)));
std::ostream & operator<<(std::ostream &fout, csl::Type type)
Definition: datalist.h:53
Definition: checkpoint.h:38
Definition: datalist.h:46
bool operator==(const Expr &a, const Expr &b)
Definition: datalist.h:61
Definition: datalist.h:41
Definition: datalist.h:34