~singpolyma/biboumi

992fa938951558f4515145c9b82af0123c979a29 — louiz’ 8 years ago c97e349
Add get_first_non_empty and use it into Database to simplify a little bit
M CMakeLists.txt => CMakeLists.txt +1 -1
@@ 96,7 96,7 @@ if(LITESQL_FOUND)

  add_library(database STATIC src/database/database.cpp
    ${LITESQL_GENERATED_SOURCES})
  target_link_libraries(database ${LITESQL_LIBRARIES})
  target_link_libraries(database ${LITESQL_LIBRARIES} src_utils)
  if(BOTAN_FOUND)
    target_link_libraries(database ${BOTAN_LIBRARIES})
  endif()

M src/database/database.cpp => src/database/database.cpp +6 -5
@@ 4,8 4,8 @@
#include <database/database.hpp>
#include <logger/logger.hpp>
#include <irc/iid.hpp>
#include <string>
#include <uuid.h>
#include <utils/get_first_non_empty.hpp>

using namespace std::string_literals;



@@ 73,10 73,11 @@ db::IrcChannelOptions Database::get_irc_channel_options_with_server_default(cons
{
  auto coptions = Database::get_irc_channel_options(owner, server, channel);
  auto soptions = Database::get_irc_server_options(owner, server);
  if (coptions.encodingIn.value().empty())
    coptions.encodingIn = soptions.encodingIn;
  if (coptions.encodingOut.value().empty())
    coptions.encodingOut = soptions.encodingOut;

  coptions.encodingIn = get_first_non_empty(coptions.encodingIn.value(),
                                            soptions.encodingIn.value());
  coptions.encodingOut = get_first_non_empty(coptions.encodingOut.value(),
                                             soptions.encodingOut.value());

  return coptions;
}

A src/utils/get_first_non_empty.cpp => src/utils/get_first_non_empty.cpp +11 -0
@@ 0,0 1,11 @@
#include <utils/get_first_non_empty.hpp>

bool is_empty(const std::string& val)
{
  return val.empty();
}

bool is_empty(const int& val)
{
  return val == 0;
}

A src/utils/get_first_non_empty.hpp => src/utils/get_first_non_empty.hpp +20 -0
@@ 0,0 1,20 @@
#pragma once

#include <string>

bool is_empty(const std::string& val);
bool is_empty(const int& val);

template <typename T>
T get_first_non_empty(T&& last)
{
  return last;
}

template <typename T, typename... Args>
T get_first_non_empty(T&& first, Args&&... args)
{
  if (!is_empty(first))
    return first;
  return get_first_non_empty(std::forward<Args>(args)...);
}

M tests/utils.cpp => tests/utils.cpp +11 -0
@@ 6,6 6,9 @@
#include <utils/split.hpp>
#include <utils/xdg.hpp>
#include <utils/empty_if_fixed_server.hpp>
#include <utils/get_first_non_empty.hpp>

using namespace std::string_literals;

TEST_CASE("String split")
{


@@ 100,3 103,11 @@ TEST_CASE("string cut")
  CHECK(res[0] == "rhello, ");
  CHECK(res[1] == "♥");
}

TEST_CASE("first non-empty string")
{
  CHECK(get_first_non_empty(""s, ""s, "hello"s, "world"s) == "hello"s);
  CHECK(get_first_non_empty(""s, ""s, ""s, ""s) == ""s);
  CHECK(get_first_non_empty("first"s) == "first"s);
  CHECK(get_first_non_empty(0, 1, 2, 3) == 1);
}