Commit 640552ab by Maarten L. Hekkelman

Remove dependency on libzeep

parent faee1848
......@@ -222,12 +222,6 @@ list(APPEND CIFPP_REQUIRED_LIBRARIES ${STDCPPFS_LIBRARY})
include(FindAtomic)
list(APPEND CIFPP_REQUIRED_LIBRARIES ${STDCPPATOMIC_LIBRARY})
if(MSVC)
# this dependency can go once MSVC supports std::experimental::is_detected
find_package(zeep 5.1.8 REQUIRED)
list(APPEND CIFPP_REQUIRED_LIBRARIES zeep::zeep)
endif()
# Create a revision file, containing the current git version info
include(VersionString)
write_version_header(${PROJECT_SOURCE_DIR}/src/ LIB_NAME "LibCIFPP")
......
......@@ -87,9 +87,6 @@ Other requirements are:
is the package `zlib1g-dev`.
- [boost](https://www.boost.org).
When building using MS Visual Studio, you will also need [libzeep](https://github.com/mhekkel/libzeep)
since MSVC does not yet provide a C++ template required by libcifpp.
The Boost libraries are only needed in case you want to build the test
code or if you are using GCC. That last condition is due to a long
standing bug in the implementation of std::regex. It simply crashes
......
......@@ -2,18 +2,11 @@
include("${CMAKE_CURRENT_LIST_DIR}/cifppTargets.cmake")
# Note that this set_and_check needs te be executed before
# find_dependency of Eigen3, otherwise the path is
# not found....
set_and_check(CIFPP_SHARE_DIR "@PACKAGE_CIFPP_DATA_DIR@")
include(CMakeFindDependencyMacro)
find_dependency(Threads)
find_dependency(Threads)
find_dependency(ZLIB REQUIRED)
if(MSVC)
find_dependency(zeep REQUIRED)
endif()
check_required_components(cifpp)
......@@ -38,15 +38,44 @@
#include <vector>
#if __has_include(<experimental/type_traits>)
#include <experimental/type_traits>
namespace std_experimental = std::experimental;
#else
// sub optimal, but replicating the same code is worse
#include <zeep/type-traits.hpp>
// A quick hack to work around the missing is_detected in MSVC
namespace std_experimental
{
namespace detail
{
template <class AlwaysVoid, template <class...> class Op, class... Args>
struct detector
{
using value_t = std::false_type;
};
template <template <class...> class Op, class... Args>
struct detector<std::void_t<Op<Args...>>, Op, Args...>
{
using value_t = std::true_type;
};
} // namespace detail
template <template <class...> class Op, class... Args>
using is_detected = typename detail::detector<void, Op, Args...>::value_t;
template <template <class...> class Op, class... Args>
const auto is_detected_v = is_detected<Op, Args...>::value;
} // namespace std_experimental
#endif
/**
* \file text.hpp
*
*
* Various text manipulating routines
*/
......@@ -82,15 +111,15 @@ void to_upper(std::string &s);
/**
* @brief Join the strings in the range [ @a a, @a e ) using
* @a sep as separator
*
*
* Example usage:
*
*
* @code {.cpp}
* std::vector<std::string> v{ "aap", "noot", "mies" };
*
*
* assert(cif::join(v.begin(), v.end(), ", ") == "aap, noot, mies");
* @endcode
*
*
*/
template <typename IterType>
std::string join(IterType b, IterType e, std::string_view sep)
......@@ -121,15 +150,15 @@ std::string join(IterType b, IterType e, std::string_view sep)
/**
* @brief Join the strings in the array @a arr using @a sep as separator
*
*
* Example usage:
*
*
* @code {.cpp}
* std::list<std::string> v{ "aap", "noot", "mies" };
*
*
* assert(cif::join(v, ", ") == "aap, noot, mies");
* @endcode
*
*
*/
template <typename V>
std::string join(const V &arr, std::string_view sep)
......@@ -139,20 +168,20 @@ std::string join(const V &arr, std::string_view sep)
/**
* @brief Split the string in @a s based on the characters in @a separators
*
*
* Each of the characters in @a separators induces a split.
*
*
* When suppress_empty is true, empty strings are not produced in the
* resulting array.
*
*
* Example:
*
*
* @code {.cpp}
* auto v = cif::split("aap:noot,,mies", ":,", true);
*
*
* assert(v == std::vector{"aap", "noot", "mies"});
* @endcode
*
*
*/
template <typename StringType = std::string_view>
std::vector<StringType> split(std::string_view s, std::string_view separators, bool suppress_empty = false)
......@@ -183,7 +212,7 @@ std::vector<StringType> split(std::string_view s, std::string_view separators, b
/**
* @brief Replace all occurrences of @a what in string @a s with the string @a with
*
*
* The string @a with may be empty in which case each occurrence of @a what is simply
* deleted.
*/
......@@ -270,7 +299,6 @@ struct iless
}
};
/// iset is a std::set of std::string but with a comparator that
/// ignores character case.
using iset = std::set<std::string, iless>;
......@@ -290,12 +318,12 @@ inline char tolower(int ch)
// --------------------------------------------------------------------
/** \brief return a tuple consisting of the category and item name for @a tag
*
*
* The category name is stripped of its leading underscore character.
*
*
* If no dot character was found, the category name is empty. That's for
* cif 1.0 formatted data.
*/
*/
std::tuple<std::string, std::string> split_tag_name(std::string_view tag);
......@@ -307,7 +335,7 @@ std::string cif_id_for_number(int number);
// --------------------------------------------------------------------
/** \brief custom word wrapping routine.
*
*
* Wrap the text in @a text based on a maximum line width @a width using
* a dynamic programming approach to get the most efficient filling of
* the space.
......@@ -574,10 +602,10 @@ using from_chars_function = decltype(std::from_chars(std::declval<const char *>(
/**
* @brief Helper to select the best implementation of charconv based on availability of the
* function in the std:: namespace
*
*
* @tparam T The type for which we want to find a from_chars/to_chars function
*/
template <typename T>
using selected_charconv = typename std::conditional_t<std::experimental::is_detected_v<from_chars_function, T>, std_charconv<T>, my_charconv<T>>;
using selected_charconv = typename std::conditional_t<std_experimental::is_detected_v<from_chars_function, T>, std_charconv<T>, my_charconv<T>>;
} // namespace cif
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment