diff options
Diffstat (limited to 'lib/filter.cpp')
-rw-r--r-- | lib/filter.cpp | 34 |
1 files changed, 33 insertions, 1 deletions
diff --git a/lib/filter.cpp b/lib/filter.cpp index 1af7314..17309f1 100644 --- a/lib/filter.cpp +++ b/lib/filter.cpp | |||
@@ -871,7 +871,7 @@ namespace verbly { | |||
871 | throw std::domain_error("This filter has no children"); | 871 | throw std::domain_error("This filter has no children"); |
872 | } | 872 | } |
873 | } | 873 | } |
874 | 874 | ||
875 | filter filter::operator!() const | 875 | filter filter::operator!() const |
876 | { | 876 | { |
877 | switch (type_) | 877 | switch (type_) |
@@ -1371,4 +1371,36 @@ namespace verbly { | |||
1371 | } | 1371 | } |
1372 | } | 1372 | } |
1373 | 1373 | ||
1374 | filter filter::compact() const | ||
1375 | { | ||
1376 | switch (type_) | ||
1377 | { | ||
1378 | case type::empty: | ||
1379 | case type::singleton: | ||
1380 | { | ||
1381 | return *this; | ||
1382 | } | ||
1383 | |||
1384 | case type::group: | ||
1385 | { | ||
1386 | filter result(group_.orlogic); | ||
1387 | for (const filter& child : group_.children) | ||
1388 | { | ||
1389 | filter compactedChild = child.compact(); | ||
1390 | if (compactedChild.type_ != type::empty) | ||
1391 | { | ||
1392 | result += child; | ||
1393 | } | ||
1394 | } | ||
1395 | |||
1396 | if (group_.children.empty()) | ||
1397 | { | ||
1398 | result = {}; | ||
1399 | } | ||
1400 | |||
1401 | return result; | ||
1402 | } | ||
1403 | } | ||
1404 | } | ||
1405 | |||
1374 | }; | 1406 | }; |