Skip to content

Commit

Permalink
Use C++20 default comparisons for section objects
Browse files Browse the repository at this point in the history
  • Loading branch information
jwakely committed Nov 4, 2024
1 parent 907d204 commit 033235d
Show file tree
Hide file tree
Showing 2 changed files with 5 additions and 44 deletions.
32 changes: 1 addition & 31 deletions src/sections.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,22 +4,9 @@
#include <sstream>
#include <iostream>
#include <cctype>
#include <tuple>
#include <utility>

auto lwg::operator<(section_tag const & x, section_tag const & y) noexcept -> bool {
return (x.prefix < y.prefix) ? true
: (y.prefix < x.prefix) ? false
: x.name < y.name;
}

auto lwg::operator==(section_tag const & x, section_tag const & y) noexcept -> bool {
return x.prefix == y.prefix && x.name == y.name;
}

auto lwg::operator!=(section_tag const & x, section_tag const & y) noexcept -> bool {
return !(x == y);
}

auto lwg::operator << (std::ostream& os, section_tag const & tag) -> std::ostream & {
os << '[';
if (!tag.prefix.empty()) { os << tag.prefix << "::"; }
Expand All @@ -34,23 +21,6 @@ std::string lwg::as_string(section_tag const & x)
: x.prefix + "::" + x.name;
}

auto lwg::operator < (section_num const & x, section_num const & y) noexcept -> bool {
// prefixes are unique, so there should be no need for a tiebreak.
return (x.prefix < y.prefix) ? true
: (y.prefix < x.prefix) ? false
: x.num < y.num;
}

auto lwg::operator == (section_num const & x, section_num const & y) noexcept -> bool {
return (x.prefix != y.prefix)
? false
: x.num == y.num;
}

auto lwg::operator != (section_num const & x, section_num const & y) noexcept -> bool {
return !(x == y);
}

auto lwg::operator >> (std::istream& is, section_num& sn) -> std::istream & {
sn.prefix.clear();
sn.num.clear();
Expand Down
17 changes: 4 additions & 13 deletions src/sections.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,33 +13,24 @@ struct section_tag
{
std::string prefix; // example: fund.ts.v2
std::string name; // example: meta.logical
bool operator==(const section_tag&) const = default;
auto operator<=>(const section_tag&) const = default;
};

struct section_num {
std::string prefix; // example: fund.ts.v2
std::vector<int> num; // sequence of numbers corresponding to section number
// in relevant doc, e.g,, 17.5.2.1.4.2
bool operator==(const section_num&) const = default;
auto operator<=>(const section_num&) const = default;
};

using section_map = std::map<section_tag, section_num>;

auto operator < (section_tag const & x, section_tag const & y) noexcept -> bool;
auto operator == (section_tag const & x, section_tag const & y) noexcept -> bool;
auto operator != (section_tag const & x, section_tag const & y) noexcept -> bool;
auto operator << (std::ostream & os,
section_tag const & tag) -> std::ostream &; // with square brackets
std::string as_string(section_tag const & x); // without square brackets

auto operator < (section_num const & x, section_num const & y) noexcept -> bool;
// section 'x' sorts before section 'y' if its 'prefix' field lexicographically
// precedes that of 'y', and its 'nun' field lexicographically precedes that
// of 'y' if the prefix fields are equivalent.

auto operator == (section_num const & x, section_num const & y) noexcept -> bool;
auto operator != (section_num const & x, section_num const & y) noexcept -> bool;
// Two 'section_num' objects compare equal if their 'prefix' and 'num' both
// compare equal.

auto operator >> (std::istream & is, section_num & sn) -> std::istream &;
auto operator << (std::ostream & os, section_num const & sn) -> std::ostream &;

Expand Down

0 comments on commit 033235d

Please sign in to comment.