Browse Source

Simplify lm::pair to use plain public members

default_compile_flags
vector-of-bool 5 years ago
parent
commit
e17acfdeb3
3 changed files with 19 additions and 43 deletions
  1. +1
    -1
      src/libman/parse.cpp
  2. +8
    -32
      src/libman/parse.hpp
  3. +10
    -10
      src/libman/parse.test.cpp

+ 1
- 1
src/libman/parse.cpp View File

@@ -79,6 +79,6 @@ lm::pair_list lm::parse_file(fs::path fpath) { return parse_string(dds::slurp_fi
void lm::write_pairs(fs::path fpath, const std::vector<pair>& pairs) {
auto fstream = dds::open(fpath, std::ios::out | std::ios::binary);
for (auto& pair : pairs) {
fstream << pair.key() << ": " << pair.value() << '\n';
fstream << pair.key << ": " << pair.value << '\n';
}
}

+ 8
- 32
src/libman/parse.hpp View File

@@ -13,25 +13,13 @@
namespace lm {

class pair {
std::string _key;
std::string _value;

public:
std::string key;
std::string value;

pair(std::string_view k, std::string_view v)
: _key(k)
, _value(v) {}

auto& key() const noexcept { return _key; }
auto& value() const noexcept { return _value; }

template <std::size_t I>
std::string_view get() const {
if constexpr (I == 0) {
return key();
} else if constexpr (I == 1) {
return value();
}
}
: key(k)
, value(v) {}
};

class pair_iterator {
@@ -53,7 +41,7 @@ public:
pair_iterator& operator++() & noexcept {
assert(_iter != _end);
++_iter;
while (_iter != _end && _iter->key() != _key) {
while (_iter != _end && _iter->key != _key) {
++_iter;
}
return *this;
@@ -88,7 +76,7 @@ public:

const pair* find(const std::string_view& key) const noexcept {
for (auto&& item : items()) {
if (item.key() == key) {
if (item.key == key) {
return &item;
}
}
@@ -98,7 +86,7 @@ public:
pair_iterator iter(std::string_view key) const noexcept {
auto iter = items().begin();
const auto end = items().end();
while (iter != end && iter->key() != key) {
while (iter != end && iter->key != key) {
++iter;
}
return pair_iterator{iter, end, key};
@@ -291,15 +279,3 @@ auto read(std::string_view context [[maybe_unused]], const pair_list& pairs, Ite
}

} // namespace lm

namespace std {

template <>
struct tuple_size<lm::pair> : std::integral_constant<int, 2> {};

template <std::size_t N>
struct tuple_element<N, lm::pair> {
using type = std::string_view;
};

} // namespace std

+ 10
- 10
src/libman/parse.test.cpp View File

@@ -18,13 +18,13 @@ void test_simple() {
kvs = parse_string(lm_src);
CHECK(kvs.size() == 1);
REQUIRE(kvs.find("foo"));
CHECK(kvs.find("foo")->value() == "bar");
CHECK(kvs.find("foo")->value == "bar");

lm_src = "foo:bar: baz";
kvs = parse_string(lm_src);
CHECK(kvs.size() == 1);
REQUIRE(kvs.find("foo:bar"));
CHECK(kvs.find("foo:bar")->value() == "baz");
CHECK(kvs.find("foo:bar")->value == "baz");

CHECK(parse_string("#comment").size() == 0);
CHECK(parse_string("\n\n").size() == 0);
@@ -46,33 +46,33 @@ void test_simple() {
kvs = parse_string(s);
CHECK(kvs.size() == 1);
REQUIRE(kvs.find("Foo"));
CHECK(kvs.find("Foo")->value() == "");
CHECK(kvs.find("Foo")->value == "");
}

kvs = parse_string("foo: # Not a comment");
CHECK(kvs.size() == 1);
REQUIRE(kvs.find("foo"));
CHECK(kvs.find("foo")->value() == "# Not a comment");
CHECK(kvs.find("foo")->value == "# Not a comment");
}

void test_multi() {
auto kvs = parse_string("Foo: bar\nbaz: qux");
CHECK(kvs.size() == 2);
REQUIRE(kvs.find("Foo"));
CHECK(kvs.find("Foo")->value() == "bar");
CHECK(kvs.find("Foo")->value == "bar");
REQUIRE(kvs.find("baz"));
CHECK(kvs.find("baz")->value() == "qux");
CHECK(kvs.find("baz")->value == "qux");

kvs = parse_string("foo: first\nfoo: second\n");
CHECK(kvs.size() == 2);
auto iter = kvs.iter("foo");
REQUIRE(iter);
CHECK(iter->key() == "foo");
CHECK(iter->value() == "first");
CHECK(iter->key == "foo");
CHECK(iter->value == "first");
++iter;
REQUIRE(iter);
CHECK(iter->key() == "foo");
CHECK(iter->value() == "second");
CHECK(iter->key == "foo");
CHECK(iter->value == "second");
++iter;
CHECK(!iter);


Loading…
Cancel
Save