aboutsummaryrefslogtreecommitdiff
path: root/include/proj/internal/internal.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'include/proj/internal/internal.hpp')
-rw-r--r--include/proj/internal/internal.hpp190
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