diff options
Diffstat (limited to 'include/proj/internal/internal.hpp')
| -rw-r--r-- | include/proj/internal/internal.hpp | 190 |
1 files changed, 190 insertions, 0 deletions
diff --git a/include/proj/internal/internal.hpp b/include/proj/internal/internal.hpp new file mode 100644 index 00000000..cbf6e259 --- /dev/null +++ b/include/proj/internal/internal.hpp @@ -0,0 +1,190 @@ +/****************************************************************************** + * + * Project: PROJ + * Purpose: ISO19111:2018 implementation + * Author: Even Rouault <even dot rouault at spatialys dot com> + * + ****************************************************************************** + * Copyright (c) 2018, Even Rouault <even dot rouault at spatialys dot com> + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + ****************************************************************************/ + +#ifndef FROM_PROJ_CPP +#error This file should only be included from a PROJ cpp file +#endif + +#ifndef INTERNAL_HH_INCLUDED +#define INTERNAL_HH_INCLUDED + +#if !(__cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1900)) +#error Must have C++11 or newer. +#endif + +#include <cassert> +#include <cstring> +#include <memory> +#include <string> +#ifndef DOXYGEN_ENABLED +#include <type_traits> // for std::is_base_of +#endif +#include <vector> + +#include "proj/util.hpp" + +//! @cond Doxygen_Suppress + +#if ((defined(__clang__) && \ + (__clang_major__ > 3 || \ + (__clang_major__ == 3 && __clang_minor__ >= 7))) || \ + __GNUC__ >= 7) +/** Macro for fallthrough in a switch case construct */ +#define PROJ_FALLTHROUGH [[clang::fallthrough]]; +#else +/** Macro for fallthrough in a switch case construct */ +#define PROJ_FALLTHROUGH +#endif + +#if defined(__clang__) || defined(_MSC_VER) +#define COMPILER_WARNS_ABOUT_ABSTRACT_VBASE_INIT +#endif + +#if !(defined(__clang__) && __clang_major__ < 5) && !defined(__INTEL_COMPILER) +#define SUPPORT_DELETED_FUNCTION +#endif + +NS_PROJ_START + +namespace operation { +class OperationParameterValue; +} // namespace operation + +namespace internal { + +/** Use cpl::down_cast<Derived*>(pointer_to_base) as equivalent of + * static_cast<Derived*>(pointer_to_base) with safe checking in debug + * mode. + * + * Only works if no virtual inheritance is involved. + * + * @param f pointer to a base class + * @return pointer to a derived class + */ +template <typename To, typename From> inline To down_cast(From *f) { + static_assert( + (std::is_base_of<From, typename std::remove_pointer<To>::type>::value), + "target type not derived from source type"); + assert(f == nullptr || dynamic_cast<To>(f) != nullptr); + return static_cast<To>(f); +} + +/* Borrowed from C++14 */ +template <typename T, typename... Args> +std::unique_ptr<T> make_unique(Args &&... args) { + return std::unique_ptr<T>(new T(std::forward<Args>(args)...)); +} + +PROJ_FOR_TEST std::string replaceAll(const std::string &str, + const std::string &before, + const std::string &after); + +size_t ci_find(const std::string &osStr, const char *needle) noexcept; + +size_t ci_find(const std::string &osStr, const std::string &needle, + size_t startPos = 0) noexcept; + +inline bool starts_with(const std::string &str, + const std::string &prefix) noexcept { + if (str.size() < prefix.size()) { + return false; + } + return std::memcmp(str.c_str(), prefix.c_str(), prefix.size()) == 0; +} + +inline bool starts_with(const std::string &str, const char *prefix) noexcept { + const size_t prefixSize = std::strlen(prefix); + if (str.size() < prefixSize) { + return false; + } + return std::memcmp(str.c_str(), prefix, prefixSize) == 0; +} + +bool ci_starts_with(const char *str, const char *prefix) noexcept; + +bool ci_starts_with(const std::string &str, const std::string &prefix) noexcept; + +bool ends_with(const std::string &str, const std::string &suffix) noexcept; + +PROJ_FOR_TEST std::string tolower(const std::string &osStr); + +std::string toupper(const std::string &osStr); + +PROJ_FOR_TEST std::vector<std::string> split(const std::string &osStr, + char separator); + +bool ci_equal(const char *a, const char *b) noexcept; + +#ifdef SUPPORT_DELETED_FUNCTION +bool ci_equal(const char *a, const std::string &b) = delete; +#endif + +PROJ_FOR_TEST bool ci_equal(const std::string &a, const char *b) noexcept; + +PROJ_FOR_TEST bool ci_equal(const std::string &a, + const std::string &b) noexcept; + +std::string stripQuotes(const std::string &osStr); + +std::string toString(int val); + +PROJ_FOR_TEST std::string toString(double val, int precision = 15); + +PROJ_FOR_TEST double +c_locale_stod(const std::string &s); // throw(std::invalid_argument) + +#ifdef SUPPORT_DELETED_FUNCTION +std::string concat(const std::string &, const std::string &) = delete; +std::string concat(const char *, const char *) = delete; +#endif +std::string concat(const char *a, const std::string &b); +#ifdef SUPPORT_DELETED_FUNCTION +std::string concat(const std::string &, const char *) = delete; +std::string concat(const char *, const char *, const char *) = delete; +std::string concat(const char *, const char *, const std::string &) = delete; +#endif +std::string concat(const char *a, const std::string &b, const char *c); +#ifdef SUPPORT_DELETED_FUNCTION +std::string concat(const char *, const std::string &, + const std::string &) = delete; +std::string concat(const std::string &, const char *, const char *) = delete; +std::string concat(const std::string &, const char *, + const std::string &) = delete; +std::string concat(const std::string &, const std::string &, + const char *) = delete; +std::string concat(const std::string &, const std::string &, + const std::string &) = delete; +#endif + +} // namespace internal + +NS_PROJ_END + +//! @endcond + +#endif // INTERNAL_HH_INCLUDED |
