Skip to content

Commit

Permalink
Header-only mode (fix on Linux)
Browse files Browse the repository at this point in the history
  • Loading branch information
dmitigr committed Jul 1, 2019
1 parent 7a00e96 commit 5719644
Show file tree
Hide file tree
Showing 2 changed files with 138 additions and 134 deletions.
270 changes: 137 additions & 133 deletions lib/dmitigr/pgfe/array_conversions.hpp
Expand Up @@ -355,6 +355,143 @@ class Filler_of_deepest_container final {
Container_type& cont_;
};

// -------------------------------------

/**
* @internal
*
* @brief Special overloads.
*/
namespace arrays {

/**
* @internal
*
* Used by: fill_container()
*/
template<typename T, typename ... Types>
const char* fill_container(T& /*result*/, const char* /*literal*/,
const char /*delimiter*/, Types&& ... /*args*/)
{
throw iClient_exception(Client_errc::insufficient_array_dimensionality);
}

/**
* @internal
*
* Used by: to_array_literal()
*/
template<typename T>
const char* quote_for_array_element(const T&)
{
return "\"";
}

/**
* @internal
*
* Used by: to_array_literal()
*/
template<typename T,
template<class> class Optional,
template<class, class> class Container,
template<class> class Allocator>
const char* quote_for_array_element(const Container<Optional<T>, Allocator<Optional<T>>>&)
{
return "";
}

/**
* @internal
*
* Used by: to_array_literal()
*/
template<typename T, typename ... Types>
std::string to_array_literal(const T& element,
const char /*delimiter*/, Types&& ... args)
{
return Conversions<T>::to_string(element, std::forward<Types>(args)...);
}

/**
* @internal
*
* Used by: to_array_literal()
*/
template<class CharT, class Traits, class Allocator, typename ... Types>
std::string to_array_literal(const std::basic_string<CharT, Traits, Allocator>& element,
const char /*delimiter*/, Types&& ... args)
{
using String = std::basic_string<CharT, Traits, Allocator>;

std::string result{Conversions<String>::to_string(element, std::forward<Types>(args)...)};

// Escaping quotes.
typename String::size_type i = result.find("\"");
while (i != String::npos) {
result.replace(i, 1, "\\\"");
i = result.find("\"", i + 2);
}

return result;
}

/**
* @internal
*
* Used by: to_container_of_values()
*/
template<typename T>
T to_container_of_values(T&& element)
{
return std::move(element);
}

/**
* @internal
*
* Used by: to_container_of_optionals()
*
* @remarks Workaround for GCC.
*/
template<template<class> class Optional>
Optional<std::string> to_container_of_optionals(std::string&& element)
{
return Optional<std::string>{std::move(element)};
}

/**
* @internal
*
* @overload
*
* @remarks It does not works with GCC. (And it does not needs to MSVC.)
* Thus, this specialization is not required at all. But let it be just in case.
*/
template<template<class> class Optional, class CharT, class Traits, class Allocator>
Optional<std::basic_string<CharT, Traits, Allocator>> to_container_of_optionals(std::basic_string<CharT, Traits, Allocator>&& element)
{
using String = std::basic_string<CharT, Traits, Allocator>;
return Optional<String>{std::move(element)};
}

/**
* @internal
*
* @overload
*
* Used by: to_container_of_optionals()
*/
template<template<class> class Optional, typename T>
Optional<T> to_container_of_optionals(T&& element)
{
return Optional<T>{std::move(element)};
}

} // namespace arrays

// -------------------------------------

/**
* @internal
*
Expand Down Expand Up @@ -590,139 +727,6 @@ const char* fill_container(Container<Optional<T>, Allocator<Optional<T>>>& resul
}
}

/**
* @internal
*
* @brief Special overloads.
*/
namespace arrays {

/**
* @internal
*
* Used by: fill_container()
*/
template<typename T, typename ... Types>
const char* fill_container(T& /*result*/, const char* /*literal*/,
const char /*delimiter*/, Types&& ... /*args*/)
{
throw iClient_exception(Client_errc::insufficient_array_dimensionality);
}

/**
* @internal
*
* Used by: to_array_literal()
*/
template<typename T>
const char* quote_for_array_element(const T&)
{
return "\"";
}

/**
* @internal
*
* Used by: to_array_literal()
*/
template<typename T,
template<class> class Optional,
template<class, class> class Container,
template<class> class Allocator>
const char* quote_for_array_element(const Container<Optional<T>, Allocator<Optional<T>>>&)
{
return "";
}

/**
* @internal
*
* Used by: to_array_literal()
*/
template<typename T, typename ... Types>
std::string to_array_literal(const T& element,
const char /*delimiter*/, Types&& ... args)
{
return Conversions<T>::to_string(element, std::forward<Types>(args)...);
}

/**
* @internal
*
* Used by: to_array_literal()
*/
template<class CharT, class Traits, class Allocator, typename ... Types>
std::string to_array_literal(const std::basic_string<CharT, Traits, Allocator>& element,
const char /*delimiter*/, Types&& ... args)
{
using String = std::basic_string<CharT, Traits, Allocator>;

std::string result{Conversions<String>::to_string(element, std::forward<Types>(args)...)};

// Escaping quotes.
typename String::size_type i = result.find("\"");
while (i != String::npos) {
result.replace(i, 1, "\\\"");
i = result.find("\"", i + 2);
}

return result;
}

/**
* @internal
*
* Used by: to_container_of_values()
*/
template<typename T>
T to_container_of_values(T&& element)
{
return std::move(element);
}

/**
* @internal
*
* Used by: to_container_of_optionals()
*
* @remarks Workaround for GCC.
*/
template<template<class> class Optional>
Optional<std::string> to_container_of_optionals(std::string&& element)
{
return Optional<std::string>{std::move(element)};
}

/**
* @internal
*
* @overload
*
* @remarks It does not works with GCC. (And it does not needs to MSVC.)
* Thus, this specialization is not required at all. But let it be just in case.
*/
template<template<class> class Optional, class CharT, class Traits, class Allocator>
Optional<std::basic_string<CharT, Traits, Allocator>> to_container_of_optionals(std::basic_string<CharT, Traits, Allocator>&& element)
{
using String = std::basic_string<CharT, Traits, Allocator>;
return Optional<String>{std::move(element)};
}

/**
* @internal
*
* @overload
*
* Used by: to_container_of_optionals()
*/
template<template<class> class Optional, typename T>
Optional<T> to_container_of_optionals(T&& element)
{
return Optional<T>{std::move(element)};
}

} // namespace arrays

template<typename T,
template<class> class Optional,
template<class, class> class Container,
Expand Down
2 changes: 1 addition & 1 deletion lib/dmitigr/pgfe/std_system_error.cpp
Expand Up @@ -50,7 +50,7 @@ DMITIGR_PGFE_INLINE const Client_error_category& client_error_category() noexcep
return result;
}

DMITIGR_PGFE_INLINE const Server_error_category& pgfe::server_error_category() noexcept
DMITIGR_PGFE_INLINE const Server_error_category& server_error_category() noexcept
{
static const Server_error_category result;
return result;
Expand Down

0 comments on commit 5719644

Please sign in to comment.