diff options
author | louiz’ <louiz@louiz.org> | 2018-03-17 17:28:47 +0100 |
---|---|---|
committer | louiz’ <louiz@louiz.org> | 2018-03-17 17:28:47 +0100 |
commit | 03714c6cebf90dc7db8e3997a18cdd19e039c667 (patch) | |
tree | c7f32136db1a40492f18cbd635a1bab761d14ced | |
parent | d0e3c71b91f1a1c1780158789fd42b8ac7209495 (diff) | |
download | biboumi-03714c6cebf90dc7db8e3997a18cdd19e039c667.tar.gz biboumi-03714c6cebf90dc7db8e3997a18cdd19e039c667.tar.bz2 biboumi-03714c6cebf90dc7db8e3997a18cdd19e039c667.tar.xz biboumi-03714c6cebf90dc7db8e3997a18cdd19e039c667.zip |
Revert "Use std::optional<bool> instead of OptionalBool"
This reverts commit ba879a882e031d7b8503f78fe41d1210000c96ca.
-rw-r--r-- | src/database/database.hpp | 2 | ||||
-rw-r--r-- | src/database/query.cpp | 12 | ||||
-rw-r--r-- | src/database/query.hpp | 4 | ||||
-rw-r--r-- | src/database/select_query.hpp | 9 | ||||
-rw-r--r-- | src/utils/optional_bool.cpp | 4 | ||||
-rw-r--r-- | src/utils/optional_bool.hpp | 48 | ||||
-rw-r--r-- | src/xmpp/biboumi_adhoc_commands.cpp | 14 | ||||
-rw-r--r-- | tests/database.cpp | 8 |
8 files changed, 59 insertions, 42 deletions
diff --git a/src/database/database.hpp b/src/database/database.hpp index 03d82ae..8a967d8 100644 --- a/src/database/database.hpp +++ b/src/database/database.hpp @@ -69,7 +69,7 @@ class Database struct RecordHistory: Column<bool> { static constexpr auto name = "recordhistory_"; RecordHistory(): Column<bool>(true) {}}; - struct RecordHistoryOptional: Column<std::optional<bool>> { static constexpr auto name = "recordhistory_"; }; + struct RecordHistoryOptional: Column<OptionalBool> { static constexpr auto name = "recordhistory_"; }; struct VerifyCert: Column<bool> { static constexpr auto name = "verifycert_"; VerifyCert(): Column<bool>(true) {} }; diff --git a/src/database/query.cpp b/src/database/query.cpp index 13c881b..d72066e 100644 --- a/src/database/query.cpp +++ b/src/database/query.cpp @@ -11,11 +11,11 @@ void actual_bind(Statement& statement, const std::int64_t& value, int index) statement.bind_int64(index, value); } -void actual_bind(Statement& statement, const std::optional<bool>& value, int index) +void actual_bind(Statement& statement, const OptionalBool& value, int index) { - if (!value) + if (!value.is_set) statement.bind_int64(index, 0); - else if (*value) + else if (value.value) statement.bind_int64(index, 1); else statement.bind_int64(index, -1); @@ -26,11 +26,11 @@ void actual_add_param(Query& query, const std::string& val) query.params.push_back(val); } -void actual_add_param(Query& query, const std::optional<bool>& val) +void actual_add_param(Query& query, const OptionalBool& val) { - if (!val) + if (!val.is_set) query.params.push_back("0"); - else if (*val) + else if (val.value) query.params.push_back("1"); else query.params.push_back("-1"); diff --git a/src/database/query.hpp b/src/database/query.hpp index 1c4a5ff..ba28b1a 100644 --- a/src/database/query.hpp +++ b/src/database/query.hpp @@ -18,7 +18,7 @@ void actual_bind(Statement& statement, const T& value, int index) { actual_bind(statement, static_cast<std::int64_t>(value), index); } -void actual_bind(Statement& statement, const std::optional<bool>& value, int index); +void actual_bind(Statement& statement, const OptionalBool& value, int index); #ifdef DEBUG_SQL_QUERIES #include <utils/scopetimer.hpp> @@ -71,6 +71,7 @@ void actual_add_param(Query& query, const T& val) } void actual_add_param(Query& query, const std::string& val); +void actual_add_param(Query& query, const OptionalBool& val); template <typename T> typename std::enable_if<!std::is_integral<T>::value, Query&>::type @@ -79,7 +80,6 @@ operator<<(Query& query, const T&) query.body += T::name; return query; } -void actual_add_param(Query& query, const std::optional<bool>& val); Query& operator<<(Query& query, const char* str); Query& operator<<(Query& query, const std::string& str); diff --git a/src/database/select_query.hpp b/src/database/select_query.hpp index cd9943c..5a17f38 100644 --- a/src/database/select_query.hpp +++ b/src/database/select_query.hpp @@ -29,15 +29,16 @@ extract_row_value(Statement& statement, const int i) } template <typename T> -typename std::enable_if<std::is_same<std::optional<bool>, T>::value, T>::type +typename std::enable_if<std::is_same<OptionalBool, T>::value, T>::type extract_row_value(Statement& statement, const int i) { const auto integer = statement.get_column_int(i); + OptionalBool result; if (integer > 0) - return true; + result.set_value(true); else if (integer < 0) - return false; - return std::nullopt; + result.set_value(false); + return result; } template <std::size_t N=0, typename... T> diff --git a/src/utils/optional_bool.cpp b/src/utils/optional_bool.cpp index 1d1c375..56fdca2 100644 --- a/src/utils/optional_bool.cpp +++ b/src/utils/optional_bool.cpp @@ -1,8 +1,8 @@ #include <utils/optional_bool.hpp> -std::ostream& operator<<(std::ostream& os, const std::optional<bool>& o) +std::ostream& operator<<(std::ostream& os, const OptionalBool& o) { - os << std::to_string(o); + os << o.to_string(); return os; } diff --git a/src/utils/optional_bool.hpp b/src/utils/optional_bool.hpp index c652ed3..867aca2 100644 --- a/src/utils/optional_bool.hpp +++ b/src/utils/optional_bool.hpp @@ -1,21 +1,37 @@ #pragma once -#include <optional> - #include <string> -namespace std -{ -inline -std::string to_string(const std::optional<bool> b) +struct OptionalBool { - if (!b) - return "unset"; - else if (*b) - return "true"; - else - return "false"; -} -} - -std::ostream& operator<<(std::ostream& os, const std::optional<bool>& o); + OptionalBool() = default; + + OptionalBool(bool value): + is_set(true), value(value) {} + + void set_value(bool value) + { + this->is_set = true; + this->value = value; + } + + void unset() + { + this->is_set = false; + } + + std::string to_string() const + { + if (this->is_set == false) + return "unset"; + else if (this->value) + return "true"; + else + return "false"; + } + + bool is_set{false}; + bool value{false}; +}; + +std::ostream& operator<<(std::ostream& os, const OptionalBool& o); diff --git a/src/xmpp/biboumi_adhoc_commands.cpp b/src/xmpp/biboumi_adhoc_commands.cpp index 53ec98b..38b6165 100644 --- a/src/xmpp/biboumi_adhoc_commands.cpp +++ b/src/xmpp/biboumi_adhoc_commands.cpp @@ -493,7 +493,7 @@ void insert_irc_channel_configuration_form(XmlNode& node, const Jid& requester, { // Value selected by default XmlSubNode value(record_history, "value"); - value.set_inner(std::to_string(options.col<Database::RecordHistoryOptional>())); + value.set_inner(options.col<Database::RecordHistoryOptional>().to_string()); } // All three possible values for (const auto& val: {"unset", "true", "false"}) @@ -594,19 +594,19 @@ bool handle_irc_channel_configuration_form(XmppComponent& xmpp_component, const else if (field->get_tag("var") == "record_history" && value && !value->get_inner().empty()) { - std::optional<bool>& database_value = options.col<Database::RecordHistoryOptional>(); + OptionalBool& database_value = options.col<Database::RecordHistoryOptional>(); if (value->get_inner() == "true") - database_value = true; + database_value.set_value(true); else if (value->get_inner() == "false") - database_value = false; + database_value.set_value(false); else - database_value.reset(); + database_value.unset(); auto& biboumi_component = dynamic_cast<BiboumiComponent&>(xmpp_component); Bridge* bridge = biboumi_component.find_user_bridge(requester.bare()); if (bridge) { - if (database_value) - bridge->set_record_history(*database_value); + if (database_value.is_set) + bridge->set_record_history(database_value.value); else { // It is unset, we need to fetch the Global option, to // know if it’s enabled or not diff --git a/tests/database.cpp b/tests/database.cpp index 88b4834..7ab6da8 100644 --- a/tests/database.cpp +++ b/tests/database.cpp @@ -56,13 +56,13 @@ TEST_CASE("Database") CHECK(o.col<Database::EncodingIn>() == ""); o.col<Database::EncodingIn>() = "ISO-8859-1"; - CHECK(!o.col<Database::RecordHistoryOptional>()); - o.col<Database::RecordHistoryOptional>() = false; + CHECK(o.col<Database::RecordHistoryOptional>().is_set == false); + o.col<Database::RecordHistoryOptional>().set_value(false); o.save(Database::db); auto b = Database::get_irc_channel_options("zouzou@example.com", "irc.example.com", "#foo"); CHECK(o.col<Database::EncodingIn>() == "ISO-8859-1"); - CHECK(o.col<Database::RecordHistoryOptional>()); - CHECK(*o.col<Database::RecordHistoryOptional>() == false); + CHECK(o.col<Database::RecordHistoryOptional>().is_set == true); + CHECK(o.col<Database::RecordHistoryOptional>().value == false); } SECTION("Channel options with server default") |