Skip to content

Commit

Permalink
Header-only mode and some API changes
Browse files Browse the repository at this point in the history
Dmitigr Pgfe can be used as a header-only library from now!

API changes: *_library_initialization_enabled() functions
were replaced with set_initialization(External_library).

Cleanup: unuseful stuff were removed.

Optimization: mark some classes and structures as final.
  • Loading branch information
dmitigr committed Jul 1, 2019
1 parent 4f8646d commit 7a00e96
Show file tree
Hide file tree
Showing 76 changed files with 5,440 additions and 5,429 deletions.
118 changes: 40 additions & 78 deletions CMakeLists.txt
Expand Up @@ -18,16 +18,13 @@ set(dmitigr_pgfe_version_part1 1)
set(dmitigr_pgfe_version_part2 1)
add_definitions(-DDMITIGR_PGFE_VERSION_PART1=${dmitigr_pgfe_version_part1})
add_definitions(-DDMITIGR_PGFE_VERSION_PART2=${dmitigr_pgfe_version_part2})
if(WIN32)
add_definitions(-DNOMINMAX)
endif()

# ------------------------------------------------------------------------------
# Build options
# ------------------------------------------------------------------------------

option(BUILD_SHARED_LIBS "Build shared library?" ON)
set(DMITIGR_PGFE_HEADER_ONLY OFF) # TODO
option(DMITIGR_PGFE_HEADER_ONLY "Header-only library?" OFF)
option(DMITIGR_PGFE_BUILD_TESTS "Build tests?" ON)

if(NOT DMITIGR_PGFE_HEADER_ONLY)
Expand Down Expand Up @@ -296,7 +293,7 @@ include_directories(BEFORE ${CMAKE_CURRENT_SOURCE_DIR}/lib)
include_directories(BEFORE ${CMAKE_CURRENT_BINARY_DIR}/lib)

# ------------------------------------------------------------------------------
# Preprocessing of the sources
# Preprocessing
# ------------------------------------------------------------------------------

# Generated headers (.hpp) should go to the CMAKE_CURRENT_SOURCE_DIR, but
Expand Down Expand Up @@ -327,94 +324,71 @@ set(dmitigr_pgfe_preprocessed_headers
${CMAKE_CURRENT_BINARY_DIR}/lib/dmitigr/pgfe/connection_options.cxx
)

# set(dmitigr_pgfe_header_only_headers
# lib/dmitigr/pgfe/header_only.hpp
# )
set(dmitigr_pgfe_header_only_headers
lib/dmitigr/pgfe/implementation_footer.hpp
lib/dmitigr/pgfe/implementation_header.hpp
)

set(dmitigr_pgfe_headers
lib/dmitigr/pgfe/array_conversions.hpp
lib/dmitigr/pgfe/basic_conversions.hpp

lib/dmitigr/pgfe/completion.hpp
lib/dmitigr/pgfe/completion.hxx

lib/dmitigr/pgfe/compositional.hpp
lib/dmitigr/pgfe/compositional.hxx

lib/dmitigr/pgfe/composite.hpp
lib/dmitigr/pgfe/composite.hxx

lib/dmitigr/pgfe/connection.hpp
lib/dmitigr/pgfe/connection.hxx

lib/dmitigr/pgfe/connection_options.hpp
lib/dmitigr/pgfe/connection_options.hxx

lib/dmitigr/pgfe/conversions_api.hpp
lib/dmitigr/pgfe/conversions.hpp
lib/dmitigr/pgfe/conversions.hxx

lib/dmitigr/pgfe/data.hpp
lib/dmitigr/pgfe/data.hxx

lib/dmitigr/pgfe/dll.hpp

lib/dmitigr/pgfe/errc.hxx

lib/dmitigr/pgfe/error.hpp
lib/dmitigr/pgfe/error.hxx

lib/dmitigr/pgfe/exceptions.hpp
lib/dmitigr/pgfe/exceptions.hxx

lib/dmitigr/pgfe/message.hpp

lib/dmitigr/pgfe/misc.hpp

lib/dmitigr/pgfe/net.hxx

lib/dmitigr/pgfe/notice.hpp
lib/dmitigr/pgfe/notice.hxx

lib/dmitigr/pgfe/notification.hpp
lib/dmitigr/pgfe/notification.hxx

lib/dmitigr/pgfe/parameterizable.hpp
lib/dmitigr/pgfe/parameterizable.hxx

lib/dmitigr/pgfe/pq.hxx

lib/dmitigr/pgfe/prepared_statement.hpp
lib/dmitigr/pgfe/prepared_statement.hxx

lib/dmitigr/pgfe/pq.hpp
lib/dmitigr/pgfe/prepared_statement_dfn.hpp
lib/dmitigr/pgfe/prepared_statement_impl.hpp
lib/dmitigr/pgfe/problem.hpp
lib/dmitigr/pgfe/problem.hxx

lib/dmitigr/pgfe/response.hpp

lib/dmitigr/pgfe/row.hpp
lib/dmitigr/pgfe/row.hxx

lib/dmitigr/pgfe/row_info.hpp
lib/dmitigr/pgfe/row_info.hxx

lib/dmitigr/pgfe/server_message.hpp

lib/dmitigr/pgfe/signal.hpp

lib/dmitigr/pgfe/sql.hxx

lib/dmitigr/pgfe/sql_string.hpp
lib/dmitigr/pgfe/sql_string.hxx

lib/dmitigr/pgfe/sql_vector.hpp
lib/dmitigr/pgfe/sql_vector.hxx

lib/dmitigr/pgfe/std_system_error.hpp

lib/dmitigr/pgfe/util.hpp
lib/dmitigr/pgfe/types_fwd.hpp
)

set(dmitigr_pgfe_implementations
lib/dmitigr/pgfe/basics.cpp
lib/dmitigr/pgfe/completion.cpp
lib/dmitigr/pgfe/composite.cpp
lib/dmitigr/pgfe/compositional.cpp
lib/dmitigr/pgfe/connection.cpp
lib/dmitigr/pgfe/connection_options.cpp
lib/dmitigr/pgfe/data.cpp
lib/dmitigr/pgfe/errc.cpp
lib/dmitigr/pgfe/error.cpp
lib/dmitigr/pgfe/exceptions.cpp
lib/dmitigr/pgfe/misc.cpp
lib/dmitigr/pgfe/notice.cpp
lib/dmitigr/pgfe/notification.cpp
lib/dmitigr/pgfe/parameterizable.cpp
lib/dmitigr/pgfe/prepared_statement_impl.cpp
lib/dmitigr/pgfe/problem.cpp
lib/dmitigr/pgfe/row.cpp
lib/dmitigr/pgfe/row_info.cpp
lib/dmitigr/pgfe/sql_string.cpp
lib/dmitigr/pgfe/sql_vector.cpp
lib/dmitigr/pgfe/std_system_error.cpp
lib/dmitigr/pgfe/util.cpp
)

set(dmitigr_pgfe_cmake_sources
lib/dmitigr/pgfe/basics.cmake
lib/dmitigr/pgfe/errc.cmake
Expand All @@ -427,27 +401,14 @@ set(dmitigr_pgfe_cmake_unpreprocessed
)

set(dmitigr_pgfe_transunits
lib/dmitigr/pgfe/basics.cpp
lib/dmitigr/pgfe/composite.cpp
lib/dmitigr/pgfe/connection.cpp
lib/dmitigr/pgfe/connection_options.cpp
lib/dmitigr/pgfe/data.cpp
lib/dmitigr/pgfe/errc.cxx
lib/dmitigr/pgfe/misc.cpp
lib/dmitigr/pgfe/net.cxx
lib/dmitigr/pgfe/prepared_statement.cxx
lib/dmitigr/pgfe/problem.cpp
lib/dmitigr/pgfe/sql.cxx
lib/dmitigr/pgfe/sql_string.cpp
lib/dmitigr/pgfe/sql_string.cxx
lib/dmitigr/pgfe/sql_vector.cpp
lib/dmitigr/pgfe/std_system_error.cpp
lib/dmitigr/pgfe.cpp
)

set(dmitigr_pgfe_sources
${dmitigr_pgfe_root_headers}
#${dmitigr_pgfe_header_only_headers}
${dmitigr_pgfe_header_only_headers}
${dmitigr_pgfe_headers}
${dmitigr_pgfe_implementations}
${dmitigr_pgfe_cmake_sources}
${dmitigr_pgfe_cmake_unpreprocessed}
${dmitigr_pgfe_transunits}
Expand All @@ -458,6 +419,7 @@ if (WIN32)
endif()

set_source_files_properties(
${dmitigr_pgfe_implementations}
${dmitigr_pgfe_cmake_sources}
${dmitigr_pgfe_cmake_unpreprocessed}

Expand Down Expand Up @@ -534,7 +496,7 @@ include_directories(${Pq_INCLUDE_DIRS})

if(NOT DMITIGR_PGFE_HEADER_ONLY)
target_link_libraries(${dmitigr_pgfe_target}
PRIVATE ${Suggested_Pq_LIBRARIES} ${dmitigr_common_library})
PUBLIC ${Suggested_Pq_LIBRARIES} ${dmitigr_common_library})

if (UNIX)
target_link_libraries(${dmitigr_pgfe_target} PRIVATE stdc++fs)
Expand Down
7 changes: 7 additions & 0 deletions lib/dmitigr/pgfe.cpp
@@ -0,0 +1,7 @@
// -*- C++ -*-
// Copyright (C) Dmitry Igrishin
// For conditions of distribution and use, see files LICENSE.txt or pgfe.hpp

#define DMITIGR_PGFE_HEADER_ONLY
#define DMITIGR_PGFE_BUILDING
#include "dmitigr/pgfe.hpp"
8 changes: 6 additions & 2 deletions lib/dmitigr/pgfe.hpp
Expand Up @@ -27,11 +27,12 @@
#include "dmitigr/pgfe/basic_conversions.hpp"
#include "dmitigr/pgfe/basics.hpp"
#include "dmitigr/pgfe/completion.hpp"
#include "dmitigr/pgfe/composite.hpp"
#include "dmitigr/pgfe/compositional.hpp"
#include "dmitigr/pgfe/connection.hpp"
#include "dmitigr/pgfe/connection_options.hpp"
#include "dmitigr/pgfe/conversions.hpp"
#include "dmitigr/pgfe/conversions_api.hpp"
#include "dmitigr/pgfe/conversions.hpp"
#include "dmitigr/pgfe/data.hpp"
#include "dmitigr/pgfe/errc.hpp"
#include "dmitigr/pgfe/error.hpp"
Expand All @@ -41,7 +42,9 @@
#include "dmitigr/pgfe/notice.hpp"
#include "dmitigr/pgfe/notification.hpp"
#include "dmitigr/pgfe/parameterizable.hpp"
#include "dmitigr/pgfe/prepared_statement.hpp"
#include "dmitigr/pgfe/pq.hpp"
// #include "dmitigr/pgfe/prepared_statement_dfn.hpp"
// #include "dmitigr/pgfe/prepared_statement_impl.hpp"
#include "dmitigr/pgfe/problem.hpp"
#include "dmitigr/pgfe/response.hpp"
#include "dmitigr/pgfe/row.hpp"
Expand All @@ -52,5 +55,6 @@
#include "dmitigr/pgfe/sql_vector.hpp"
#include "dmitigr/pgfe/std_system_error.hpp"
#include "dmitigr/pgfe/types_fwd.hpp"
#include "dmitigr/pgfe/util.hpp"

#endif // DMITIGR_PGFE_HPP
30 changes: 15 additions & 15 deletions lib/dmitigr/pgfe/array_conversions.hpp
Expand Up @@ -8,7 +8,7 @@
#include "dmitigr/pgfe/basic_conversions.hpp"
#include "dmitigr/pgfe/conversions_api.hpp"
#include "dmitigr/pgfe/data.hpp"
#include "dmitigr/pgfe/exceptions.hxx"
#include "dmitigr/pgfe/exceptions.hpp"

#include <dmitigr/common/debug.hpp>
#include <dmitigr/common/string.hpp>
Expand Down Expand Up @@ -52,7 +52,7 @@ Container to_container(const char* literal, char delimiter = ',', Types&& ... ar
* @brief The compile-time converter from the "container of values" type to the "container of optionals" type.
*/
template<typename T>
struct Cont_of_opts {
struct Cont_of_opts final {
using Type = T;
};

Expand All @@ -69,7 +69,7 @@ struct Cont_of_opts {
* std::basic_string<CharT, Traits, Allocator> (see below) does not works.
*/
template<>
struct Cont_of_opts<std::string> {
struct Cont_of_opts<std::string> final {
using Type = std::string;
};

Expand All @@ -86,7 +86,7 @@ struct Cont_of_opts<std::string> {
* Thus, this specialization is not required at all. But let it be just in case.
*/
template<class CharT, class Traits, class Allocator>
struct Cont_of_opts<std::basic_string<CharT, Traits, Allocator>> {
struct Cont_of_opts<std::basic_string<CharT, Traits, Allocator>> final {
using Type = std::basic_string<CharT, Traits, Allocator>;
};

Expand All @@ -98,7 +98,7 @@ struct Cont_of_opts<std::basic_string<CharT, Traits, Allocator>> {
template<typename T,
template<class, class> class Container,
template<class> class Allocator>
struct Cont_of_opts<Container<T, Allocator<T>>> {
struct Cont_of_opts<Container<T, Allocator<T>>> final {
private:
using Elem = typename Cont_of_opts<T>::Type;
public:
Expand All @@ -121,7 +121,7 @@ using Cont_of_opts_t = typename Cont_of_opts<T>::Type;
* @brief The compile-time converter from the "container of optionals" type to the "container of values" type.
*/
template<typename T>
struct Cont_of_vals {
struct Cont_of_vals final {
using Type = T;
};

Expand All @@ -134,7 +134,7 @@ template<typename T,
template<class> class Optional,
template<class, class> class Container,
template<class> class Allocator>
struct Cont_of_vals<Container<Optional<T>, Allocator<Optional<T>>>> {
struct Cont_of_vals<Container<Optional<T>, Allocator<Optional<T>>>> final {
private:
using Elem = typename Cont_of_vals<T>::Type;
public:
Expand Down Expand Up @@ -187,7 +187,7 @@ template<typename T,
template<class> class Optional,
template<class, class> class Container,
template<class> class Allocator>
struct Array_string_conversions_opts<Container<Optional<T>, Allocator<Optional<T>>>> {
struct Array_string_conversions_opts<Container<Optional<T>, Allocator<Optional<T>>>> final {
using Type = Container<Optional<T>, Allocator<Optional<T>>>;

template<typename ... Types>
Expand All @@ -207,7 +207,7 @@ template<typename T,
template<class> class Optional,
template<class, class> class Container,
template<class> class Allocator>
struct Array_data_conversions_opts<Container<Optional<T>, Allocator<Optional<T>>>> {
struct Array_data_conversions_opts<Container<Optional<T>, Allocator<Optional<T>>>> final {
using Type = Container<Optional<T>, Allocator<Optional<T>>>;

template<typename ... Types>
Expand Down Expand Up @@ -239,7 +239,7 @@ template<typename> struct Array_data_conversions_vals;
template<typename T,
template<class, class> class Container,
template<class> class Allocator>
struct Array_string_conversions_vals<Container<T, Allocator<T>>> {
struct Array_string_conversions_vals<Container<T, Allocator<T>>> final {
using Type = Container<T, Allocator<T>>;

template<typename ... Types>
Expand All @@ -262,7 +262,7 @@ struct Array_string_conversions_vals<Container<T, Allocator<T>>> {
template<typename T,
template<class, class> class Container,
template<class> class Allocator>
struct Array_data_conversions_vals<Container<T, Allocator<T>>> {
struct Array_data_conversions_vals<Container<T, Allocator<T>>> final {
using Type = Container<T, Allocator<T>>;

template<typename ... Types>
Expand Down Expand Up @@ -310,16 +310,16 @@ template<typename T,
template<class> class Optional,
template<class, class> class Container,
template<class> class Allocator>
class Filler_of_deepest_container {
class Filler_of_deepest_container final {
private:
template<typename U>
struct Is_container : std::false_type{};
struct Is_container final : std::false_type{};

template<typename U,
template<class> class Opt,
template<class, class> class Cont,
template<class> class Alloc>
struct Is_container<Cont<Opt<U>, Alloc<Opt<U>>>> : std::true_type{};
struct Is_container<Cont<Opt<U>, Alloc<Opt<U>>>> final : std::true_type{};

public:
using Value_type = T;
Expand Down Expand Up @@ -840,7 +840,7 @@ template<typename T,
template<class> class Optional,
template<class, class> class Container,
template<class> class Allocator>
struct Conversions<Container<Optional<T>, Allocator<Optional<T>>>>
struct Conversions<Container<Optional<T>, Allocator<Optional<T>>>> final
: public Basic_conversions<Container<Optional<T>, Allocator<Optional<T>>>,
detail::Array_string_conversions_opts<Container<Optional<T>, Allocator<Optional<T>>>>,
detail::Array_data_conversions_opts<Container<Optional<T>, Allocator<Optional<T>>>>> {};
Expand Down
7 changes: 7 additions & 0 deletions lib/dmitigr/pgfe/basics.cmake
Expand Up @@ -55,3 +55,10 @@ set(PGFE_PROBLEM_SEVERITY_WARNING 400)
set(PGFE_PROBLEM_SEVERITY_ERROR 500)
set(PGFE_PROBLEM_SEVERITY_FATAL 600)
set(PGFE_PROBLEM_SEVERITY_PANIC 700)

# ------------------------------------------------------------------------------
# External_library
# ------------------------------------------------------------------------------

set(PGFE_EXTERNAL_LIBRARY_LIBSSL 2)
set(PGFE_EXTERNAL_LIBRARY_LIBCRYPTO 4)

0 comments on commit 7a00e96

Please sign in to comment.