aboutsummaryrefslogtreecommitdiff
path: root/include/proj/util.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'include/proj/util.hpp')
-rw-r--r--include/proj/util.hpp752
1 files changed, 752 insertions, 0 deletions
diff --git a/include/proj/util.hpp b/include/proj/util.hpp
new file mode 100644
index 00000000..eb7288b2
--- /dev/null
+++ b/include/proj/util.hpp
@@ -0,0 +1,752 @@
+/******************************************************************************
+ *
+ * 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 UTIL_HH_INCLUDED
+#define UTIL_HH_INCLUDED
+
+#if !(__cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1900))
+#error Must have C++11 or newer.
+#endif
+
+#include <exception>
+#include <map>
+#include <memory>
+#include <string>
+#include <vector>
+
+#ifndef NS_PROJ
+/** osgeo namespace */
+namespace osgeo {
+/** osgeo.proj namespace */
+namespace proj {}
+} // namespace osgeo
+#endif
+
+//! @cond Doxygen_Suppress
+
+#ifndef PROJ_DLL
+#ifdef PROJ_MSVC_DLL_EXPORT
+#define PROJ_DLL __declspec(dllexport)
+#elif defined(PROJ_MSVC_DLL_IMPORT)
+#define PROJ_DLL __declspec(dllimport)
+#elif defined(__GNUC__)
+#define PROJ_DLL __attribute__((visibility("default")))
+#else
+#define PROJ_DLL
+#endif
+#endif
+
+#ifndef PROJ_MSVC_DLL
+
+#ifdef PROJ_MSVC_DLL_EXPORT
+#define PROJ_MSVC_DLL PROJ_DLL
+#define PROJ_GCC_DLL
+#define PROJ_INTERNAL
+#elif defined(PROJ_MSVC_DLL_IMPORT)
+#define PROJ_MSVC_DLL PROJ_DLL
+#define PROJ_GCC_DLL
+#define PROJ_INTERNAL
+#elif defined(__GNUC__)
+#define PROJ_MSVC_DLL
+#define PROJ_GCC_DLL PROJ_DLL
+#if !defined(__MINGW32__)
+#define PROJ_INTERNAL __attribute__((visibility("hidden")))
+#else
+#define PROJ_INTERNAL
+#endif
+#else
+#define PROJ_MSVC_DLL
+#define PROJ_GCC_DLL
+#define PROJ_INTERNAL
+#endif
+
+#define PROJ_FOR_TEST PROJ_DLL
+
+#endif
+
+#include "nn.hpp"
+
+/* To allow customizing the base namespace of PROJ */
+#ifndef NS_PROJ
+#define NS_PROJ osgeo::proj
+#define NS_PROJ_START \
+ namespace osgeo { \
+ namespace proj {
+#define NS_PROJ_END \
+ } \
+ }
+#endif
+
+// Private-implementation (Pimpl) pattern
+#define PROJ_OPAQUE_PRIVATE_DATA \
+ private: \
+ struct PROJ_INTERNAL Private; \
+ std::unique_ptr<Private> d; \
+ \
+ protected: \
+ PROJ_INTERNAL Private *getPrivate() noexcept { return d.get(); } \
+ PROJ_INTERNAL const Private *getPrivate() const noexcept { \
+ return d.get(); \
+ } \
+ \
+ private:
+
+// To include in the protected/private section of a class definition,
+// to be able to call make_shared on a protected/private constructor
+#define INLINED_MAKE_SHARED \
+ template <typename T, typename... Args> \
+ static std::shared_ptr<T> make_shared(Args &&... args) { \
+ return std::shared_ptr<T>(new T(std::forward<Args>(args)...)); \
+ } \
+ template <typename T, typename... Args> \
+ static util::nn_shared_ptr<T> nn_make_shared(Args &&... args) { \
+ return util::nn_shared_ptr<T>( \
+ util::i_promise_i_checked_for_null, \
+ std::shared_ptr<T>(new T(std::forward<Args>(args)...))); \
+ }
+
+// To include in the protected/private section of a class definition,
+// to be able to call make_unique on a protected/private constructor
+#define INLINED_MAKE_UNIQUE \
+ template <typename T, typename... Args> \
+ static std::unique_ptr<T> make_unique(Args &&... args) { \
+ return std::unique_ptr<T>(new T(std::forward<Args>(args)...)); \
+ }
+
+#ifdef DOXYGEN_ENABLED
+#define PROJ_FRIEND(mytype)
+#define PROJ_FRIEND_OPTIONAL(mytype)
+#else
+#define PROJ_FRIEND(mytype) friend class mytype
+#define PROJ_FRIEND_OPTIONAL(mytype) friend class util::optional<mytype>
+#endif
+
+#ifndef PROJ_PRIVATE
+#define PROJ_PRIVATE public
+#endif
+
+#if defined(__GNUC__)
+#define PROJ_NO_INLINE __attribute__((noinline))
+#define PROJ_NO_RETURN __attribute__((noreturn))
+// Applies to a function that has no side effect, and its return will not
+// change if the arguments are the same. But is return may change
+// if the object state changes. So this is for getters of mutable objects.
+#define PROJ_PURE_DECL const noexcept __attribute__((pure))
+// Applies to a function that has no side effect, and its return will not
+// change if the arguments are the same, and their pointed value must not
+// be modified. So this is for getters of immutable objets. This is stronger
+// than PROJ_PURE_DECL.
+#if defined(__INTEL_COMPILER)
+// If using __attribute__((const)), ICC on an expression like
+// Angle(x).getSIValue() will create the object, destroy it and then call
+// getSIValue(). Fallback to ((pure)), which is weaker
+#define PROJ_CONST_DECL const noexcept __attribute__((pure))
+#else
+#define PROJ_CONST_DECL const noexcept __attribute__((const))
+#endif
+#else
+#define PROJ_NO_RETURN
+#define PROJ_NO_INLINE
+#define PROJ_PURE_DECL const noexcept
+#define PROJ_CONST_DECL const noexcept
+#endif
+#define PROJ_PURE_DEFN const noexcept
+#define PROJ_CONST_DEFN const noexcept
+
+//! @endcond
+
+NS_PROJ_START
+
+/** osgeo.proj.util namespace.
+ *
+ * \brief A set of base types from ISO 19103, \ref GeoAPI and other PROJ
+ * specific classes.
+ */
+namespace util {
+
+//! @cond Doxygen_Suppress
+// Import a few classes from nn.hpp to expose them under our ::util namespace
+// for conveniency.
+using ::dropbox::oxygen::i_promise_i_checked_for_null;
+using ::dropbox::oxygen::nn;
+using ::dropbox::oxygen::nn_dynamic_pointer_cast;
+using ::dropbox::oxygen::nn_make_shared;
+
+// For return statements, to convert from derived type to base type
+using ::dropbox::oxygen::nn_static_pointer_cast;
+
+template <typename T> using nn_shared_ptr = nn<std::shared_ptr<T>>;
+
+#define NN_NO_CHECK(p) \
+ ::dropbox::oxygen::nn<typename std::remove_const< \
+ typename std::remove_reference<decltype(p)>::type>::type>( \
+ dropbox::oxygen::i_promise_i_checked_for_null, (p))
+
+//! @endcond
+
+// To avoid formatting differences between clang-format 3.8 and 7
+#define PROJ_NOEXCEPT noexcept
+
+/** \brief Loose transposition of [std::optional]
+ * (https://en.cppreference.com/w/cpp/utility/optional) available from C++17. */
+template <class T> class optional {
+ public:
+ //! @cond Doxygen_Suppress
+ inline optional() : hasVal_(false) {}
+ inline explicit optional(const T &val) : hasVal_(true), val_(val) {}
+ inline explicit optional(T &&val)
+ : hasVal_(true), val_(std::forward<T>(val)) {}
+
+ inline optional(const optional &other) = default;
+ inline optional(optional &&other) PROJ_NOEXCEPT
+ : hasVal_(other.hasVal_),
+ // cppcheck-suppress functionStatic
+ val_(std::forward<T>(other.val_)) {
+ other.hasVal_ = false;
+ }
+
+ inline optional &operator=(const T &val) {
+ hasVal_ = true;
+ val_ = val;
+ return *this;
+ }
+ inline optional &operator=(T &&val) noexcept {
+ hasVal_ = true;
+ val_ = std::forward<T>(val);
+ return *this;
+ }
+ inline optional &operator=(const optional &other) = default;
+ inline optional &operator=(optional &&other) noexcept {
+ hasVal_ = other.hasVal_;
+ val_ = std::forward<T>(other.val_);
+ other.hasVal_ = false;
+ return *this;
+ }
+
+ inline T *operator->() { return &val_; }
+ inline T &operator*() { return val_; }
+
+ //! @endcond
+
+ /** Returns a pointer to the contained value. */
+ inline const T *operator->() const { return &val_; }
+
+ /** Returns a reference to the contained value. */
+ inline const T &operator*() const { return val_; }
+
+ /** Return whether the optional has a value */
+ inline explicit operator bool() const noexcept { return hasVal_; }
+
+ /** Return whether the optional has a value */
+ inline bool has_value() const noexcept { return hasVal_; }
+
+ private:
+ bool hasVal_;
+ T val_{};
+};
+
+// ---------------------------------------------------------------------------
+
+class BaseObject;
+/** Shared pointer of BaseObject. */
+using BaseObjectPtr = std::shared_ptr<BaseObject>;
+#if 1
+/** Non-null shared pointer of BaseObject. */
+struct BaseObjectNNPtr : public util::nn<BaseObjectPtr> {
+ // This trick enables to avoid inlining of the destructor.
+ // This is mostly an alias of the base class.
+ //! @cond Doxygen_Suppress
+ template <class T>
+ // cppcheck-suppress noExplicitConstructor
+ BaseObjectNNPtr(const util::nn<std::shared_ptr<T>> &x)
+ : util::nn<BaseObjectPtr>(x) {}
+
+ template <class T>
+ // cppcheck-suppress noExplicitConstructor
+ BaseObjectNNPtr(util::nn<std::shared_ptr<T>> &&x) noexcept
+ : util::nn<BaseObjectPtr>(NN_NO_CHECK(std::move(x.as_nullable()))) {}
+
+ explicit BaseObjectNNPtr(::dropbox::oxygen::i_promise_i_checked_for_null_t,
+ BaseObjectPtr &&arg) noexcept
+ : util::nn<BaseObjectPtr>(i_promise_i_checked_for_null,
+ std::move(arg)) {}
+ BaseObjectNNPtr(const BaseObjectNNPtr &) = default;
+ BaseObjectNNPtr &operator=(const BaseObjectNNPtr &) = default;
+
+ PROJ_DLL ~BaseObjectNNPtr();
+ //! @endcond
+};
+#else
+using BaseObjectNNPtr = util::nn<BaseObjectPtr>;
+#endif
+
+/** \brief Class that can be derived from, to emulate Java's Object behaviour.
+ */
+class PROJ_GCC_DLL BaseObject {
+ public:
+ //! @cond Doxygen_Suppress
+ virtual PROJ_DLL ~BaseObject();
+ //! @endcond
+
+ PROJ_PRIVATE :
+ //! @cond Doxygen_Suppress
+ PROJ_INTERNAL BaseObjectNNPtr
+ shared_from_this() const;
+ //! @endcond
+
+ protected:
+ PROJ_INTERNAL BaseObject();
+ PROJ_INTERNAL void assignSelf(const BaseObjectNNPtr &self);
+
+ private:
+ PROJ_OPAQUE_PRIVATE_DATA
+};
+
+// ---------------------------------------------------------------------------
+
+/** \brief Interface for an object that can be compared to another.
+ */
+class PROJ_GCC_DLL IComparable {
+ public:
+ //! @cond Doxygen_Suppress
+ PROJ_DLL virtual ~IComparable();
+ //! @endcond
+
+ /** \brief Comparison criterion. */
+ enum class PROJ_MSVC_DLL Criterion {
+ /** All properties are identical. */
+ STRICT,
+
+ /** The objects are equivalent for the purpose of coordinate
+ * operations. They can differ by the name of their objects,
+ * identifiers, other metadata.
+ * Parameters may be expressed in different units, provided that the
+ * value is (with some tolerance) the same once expressed in a
+ * common unit.
+ */
+ EQUIVALENT,
+
+ /** Same as EQUIVALENT, relaxed with an exception that the axis order
+ * of the base CRS of a DerivedCRS/ProjectedCRS or the axis order of
+ * a GeographicCRS is ignored. Only to be used
+ * with DerivedCRS/ProjectedCRS/GeographicCRS */
+ EQUIVALENT_EXCEPT_AXIS_ORDER_GEOGCRS,
+ };
+
+ PROJ_DLL bool isEquivalentTo(const IComparable *other,
+ Criterion criterion = Criterion::STRICT) const;
+
+ PROJ_PRIVATE :
+
+ //! @cond Doxygen_Suppress
+ PROJ_INTERNAL virtual bool
+ _isEquivalentTo(const IComparable *other,
+ Criterion criterion = Criterion::STRICT) const = 0;
+ //! @endcond
+};
+
+// ---------------------------------------------------------------------------
+
+/** \brief Encapsulate standard datatypes in an object.
+ */
+class BoxedValue final : public BaseObject {
+ public:
+ //! @cond Doxygen_Suppress
+ /** Type of data stored in the BoxedValue. */
+ enum class Type {
+ /** a std::string */
+ STRING,
+ /** an integer */
+ INTEGER,
+ /** a boolean */
+ BOOLEAN
+ };
+ //! @endcond
+
+ // cppcheck-suppress noExplicitConstructor
+ PROJ_DLL BoxedValue(const char *stringValueIn); // needed to avoid the bool
+ // constructor to be taken !
+ // cppcheck-suppress noExplicitConstructor
+ PROJ_DLL BoxedValue(const std::string &stringValueIn);
+ // cppcheck-suppress noExplicitConstructor
+ PROJ_DLL BoxedValue(int integerValueIn);
+ // cppcheck-suppress noExplicitConstructor
+ PROJ_DLL BoxedValue(bool booleanValueIn);
+
+ PROJ_PRIVATE :
+ //! @cond Doxygen_Suppress
+ PROJ_INTERNAL
+ BoxedValue(const BoxedValue &other);
+
+ PROJ_DLL ~BoxedValue() override;
+
+ PROJ_INTERNAL const Type &type() const;
+ PROJ_INTERNAL const std::string &stringValue() const;
+ PROJ_INTERNAL int integerValue() const;
+ PROJ_INTERNAL bool booleanValue() const;
+ //! @endcond
+
+ private:
+ PROJ_OPAQUE_PRIVATE_DATA
+ BoxedValue &operator=(const BoxedValue &) = delete;
+
+ PROJ_INTERNAL BoxedValue();
+};
+
+/** Shared pointer of BoxedValue. */
+using BoxedValuePtr = std::shared_ptr<BoxedValue>;
+/** Non-null shared pointer of BoxedValue. */
+using BoxedValueNNPtr = util::nn<BoxedValuePtr>;
+
+// ---------------------------------------------------------------------------
+
+class ArrayOfBaseObject;
+/** Shared pointer of ArrayOfBaseObject. */
+using ArrayOfBaseObjectPtr = std::shared_ptr<ArrayOfBaseObject>;
+/** Non-null shared pointer of ArrayOfBaseObject. */
+using ArrayOfBaseObjectNNPtr = util::nn<ArrayOfBaseObjectPtr>;
+
+/** \brief Array of BaseObject.
+ */
+class ArrayOfBaseObject final : public BaseObject {
+ public:
+ //! @cond Doxygen_Suppress
+ PROJ_DLL ~ArrayOfBaseObject() override;
+ //! @endcond
+
+ PROJ_DLL void add(const BaseObjectNNPtr &obj);
+
+ PROJ_DLL static ArrayOfBaseObjectNNPtr create();
+
+ PROJ_PRIVATE :
+ //! @cond Doxygen_Suppress
+ std::vector<BaseObjectNNPtr>::const_iterator
+ begin() const;
+ std::vector<BaseObjectNNPtr>::const_iterator end() const;
+ bool empty() const;
+ //! @endcond
+
+ protected:
+ ArrayOfBaseObject();
+ INLINED_MAKE_SHARED
+
+ private:
+ ArrayOfBaseObject(const ArrayOfBaseObject &other) = delete;
+ ArrayOfBaseObject &operator=(const ArrayOfBaseObject &other) = delete;
+ PROJ_OPAQUE_PRIVATE_DATA
+};
+
+// ---------------------------------------------------------------------------
+
+/** \brief Wrapper of a std::map<std::string, BaseObjectNNPtr> */
+class PropertyMap {
+ public:
+ PROJ_DLL PropertyMap();
+ //! @cond Doxygen_Suppress
+ PROJ_DLL PropertyMap(const PropertyMap &other);
+ PROJ_DLL ~PropertyMap();
+ //! @endcond
+
+ PROJ_DLL PropertyMap &set(const std::string &key,
+ const BaseObjectNNPtr &val);
+
+ //! @cond Doxygen_Suppress
+ template <class T>
+ inline PropertyMap &set(const std::string &key,
+ const nn_shared_ptr<T> &val) {
+ return set(
+ key, BaseObjectNNPtr(i_promise_i_checked_for_null,
+ BaseObjectPtr(val.as_nullable(), val.get())));
+ }
+ //! @endcond
+
+ // needed to avoid the bool constructor to be taken !
+ PROJ_DLL PropertyMap &set(const std::string &key, const char *val);
+
+ PROJ_DLL PropertyMap &set(const std::string &key, const std::string &val);
+
+ PROJ_DLL PropertyMap &set(const std::string &key, int val);
+
+ PROJ_DLL PropertyMap &set(const std::string &key, bool val);
+
+ PROJ_DLL PropertyMap &set(const std::string &key,
+ const std::vector<std::string> &array);
+
+ PROJ_PRIVATE :
+ //! @cond Doxygen_Suppress
+ std::map<std::string, BaseObjectNNPtr>::iterator
+ find(const std::string &key) const;
+ std::map<std::string, BaseObjectNNPtr>::iterator end() const;
+
+ // throw(InvalidValueTypeException)
+ bool getStringValue(const std::string &key, std::string &outVal) const;
+
+ static PropertyMap createAndSetName(const char *name);
+ static PropertyMap createAndSetName(const std::string &name);
+ //! @endcond
+
+ private:
+ PropertyMap &operator=(const PropertyMap &) = delete;
+
+ PropertyMap &set(const std::string &key, const BoxedValue &val);
+
+ PROJ_OPAQUE_PRIVATE_DATA
+};
+
+// ---------------------------------------------------------------------------
+
+class LocalName;
+/** Shared pointer of LocalName. */
+using LocalNamePtr = std::shared_ptr<LocalName>;
+/** Non-null shared pointer of LocalName. */
+using LocalNameNNPtr = util::nn<LocalNamePtr>;
+
+class NameSpace;
+/** Shared pointer of NameSpace. */
+using NameSpacePtr = std::shared_ptr<NameSpace>;
+/** Non-null shared pointer of NameSpace. */
+using NameSpaceNNPtr = util::nn<NameSpacePtr>;
+
+class GenericName;
+/** Shared pointer of GenericName. */
+using GenericNamePtr = std::shared_ptr<GenericName>;
+/** Non-null shared pointer of GenericName. */
+using GenericNameNNPtr = util::nn<GenericNamePtr>;
+
+// ---------------------------------------------------------------------------
+
+/** \brief A sequence of identifiers rooted within the context of a namespace.
+ *
+ * \remark Simplified version of [GenericName]
+ * (http://www.geoapi.org/3.0/javadoc/org/opengis/util/GenericName.html) from
+ * \ref GeoAPI
+ */
+class GenericName : public BaseObject {
+ public:
+ //! @cond Doxygen_Suppress
+ PROJ_DLL virtual ~GenericName() override;
+ //! @endcond
+
+ /** \brief Return the scope of the object, possibly a global one. */
+ PROJ_DLL virtual const NameSpacePtr scope() const = 0;
+
+ /** \brief Return the LocalName as a string. */
+ PROJ_DLL virtual std::string toString() const = 0;
+
+ /** \brief Return a fully qualified name corresponding to the local name.
+ *
+ * The namespace of the resulting name is a global one.
+ */
+ PROJ_DLL virtual GenericNameNNPtr toFullyQualifiedName() const = 0;
+
+ protected:
+ GenericName();
+ GenericName(const GenericName &other);
+
+ private:
+ PROJ_OPAQUE_PRIVATE_DATA
+ GenericName &operator=(const GenericName &other) = delete;
+};
+
+// ---------------------------------------------------------------------------
+
+/** \brief A domain in which names given by strings are defined.
+ *
+ * \remark Simplified version of [NameSpace]
+ * (http://www.geoapi.org/3.0/javadoc/org/opengis/util/NameSpace.html) from \ref
+ * GeoAPI
+ */
+class NameSpace {
+ public:
+ //! @cond Doxygen_Suppress
+ PROJ_DLL ~NameSpace();
+ //! @endcond
+
+ PROJ_DLL bool isGlobal() const;
+ PROJ_DLL const GenericNamePtr &name() const;
+
+ protected:
+ PROJ_FRIEND(NameFactory);
+ PROJ_FRIEND(LocalName);
+ explicit NameSpace(const GenericNamePtr &name);
+ NameSpace(const NameSpace &other);
+ NameSpaceNNPtr getGlobalFromThis() const;
+ const std::string &separator() const;
+ static const NameSpaceNNPtr GLOBAL;
+ INLINED_MAKE_SHARED
+
+ private:
+ PROJ_OPAQUE_PRIVATE_DATA
+ NameSpace &operator=(const NameSpace &other) = delete;
+
+ static NameSpaceNNPtr createGLOBAL();
+};
+
+// ---------------------------------------------------------------------------
+
+/** \brief Identifier within a NameSpace for a local object.
+ *
+ * Local names are names which are directly accessible to and maintained by a
+ * NameSpace within which they are local, indicated by the scope.
+ *
+ * \remark Simplified version of [LocalName]
+ * (http://www.geoapi.org/3.0/javadoc/org/opengis/util/LocalName.html) from \ref
+ * GeoAPI
+ */
+class LocalName : public GenericName {
+ public:
+ //! @cond Doxygen_Suppress
+ PROJ_DLL ~LocalName() override;
+ //! @endcond
+
+ PROJ_DLL const NameSpacePtr scope() const override;
+ PROJ_DLL std::string toString() const override;
+ PROJ_DLL GenericNameNNPtr toFullyQualifiedName() const override;
+
+ protected:
+ PROJ_FRIEND(NameFactory);
+ PROJ_FRIEND(NameSpace);
+ explicit LocalName(const std::string &nameIn);
+ LocalName(const LocalName &other);
+ LocalName(const NameSpacePtr &ns, const std::string &name);
+ INLINED_MAKE_SHARED
+
+ private:
+ PROJ_OPAQUE_PRIVATE_DATA
+ LocalName &operator=(const LocalName &other) = delete;
+};
+
+// ---------------------------------------------------------------------------
+
+/** \brief Factory for generic names.
+ *
+ * \remark Simplified version of [NameFactory]
+ * (http://www.geoapi.org/3.0/javadoc/org/opengis/util/NameFactory.html) from
+ * \ref GeoAPI
+ */
+class NameFactory {
+ public:
+ PROJ_DLL static NameSpaceNNPtr
+ createNameSpace(const GenericNameNNPtr &name,
+ const PropertyMap &properties);
+ PROJ_DLL static LocalNameNNPtr createLocalName(const NameSpacePtr &scope,
+ const std::string &name);
+ PROJ_DLL static GenericNameNNPtr
+ createGenericName(const NameSpacePtr &scope,
+ const std::vector<std::string> &parsedNames);
+};
+
+// ---------------------------------------------------------------------------
+
+/** \brief Abstract class to define an enumeration of values.
+ */
+class CodeList {
+ public:
+ //! @cond Doxygen_Suppress
+ PROJ_DLL ~CodeList();
+ //! @endcond
+
+ /** Return the CodeList item as a string. */
+ // cppcheck-suppress functionStatic
+ inline const std::string &toString() PROJ_CONST_DECL { return name_; }
+
+ /** Return the CodeList item as a string. */
+ inline operator std::string() PROJ_CONST_DECL { return toString(); }
+
+ //! @cond Doxygen_Suppress
+ inline bool operator==(const CodeList &other) PROJ_CONST_DECL {
+ return name_ == other.name_;
+ }
+ inline bool operator!=(const CodeList &other) PROJ_CONST_DECL {
+ return name_ != other.name_;
+ }
+ //! @endcond
+ protected:
+ explicit CodeList(const std::string &nameIn) : name_(nameIn) {}
+ CodeList(const CodeList &other) = default;
+ CodeList &operator=(const CodeList &other);
+
+ private:
+ std::string name_{};
+};
+
+// ---------------------------------------------------------------------------
+
+/** \brief Root exception class.
+ */
+class PROJ_GCC_DLL Exception : public std::exception {
+ std::string msg_;
+
+ public:
+ //! @cond Doxygen_Suppress
+ PROJ_INTERNAL explicit Exception(const char *message);
+ PROJ_INTERNAL explicit Exception(const std::string &message);
+ PROJ_DLL Exception(const Exception &other);
+ PROJ_DLL ~Exception() override;
+ //! @endcond
+ PROJ_DLL virtual const char *what() const noexcept override;
+};
+
+// ---------------------------------------------------------------------------
+
+/** \brief Exception thrown when an invalid value type is set as the value of
+ * a key of a PropertyMap.
+ */
+class PROJ_GCC_DLL InvalidValueTypeException : public Exception {
+ public:
+ //! @cond Doxygen_Suppress
+ PROJ_INTERNAL explicit InvalidValueTypeException(const char *message);
+ PROJ_INTERNAL explicit InvalidValueTypeException(
+ const std::string &message);
+ PROJ_DLL InvalidValueTypeException(const InvalidValueTypeException &other);
+ PROJ_DLL ~InvalidValueTypeException() override;
+ //! @endcond
+};
+
+// ---------------------------------------------------------------------------
+
+/** \brief Exception Thrown to indicate that the requested operation is not
+ * supported.
+ */
+class PROJ_GCC_DLL UnsupportedOperationException : public Exception {
+ public:
+ //! @cond Doxygen_Suppress
+ PROJ_INTERNAL explicit UnsupportedOperationException(const char *message);
+ PROJ_INTERNAL explicit UnsupportedOperationException(
+ const std::string &message);
+ PROJ_DLL
+ UnsupportedOperationException(const UnsupportedOperationException &other);
+ PROJ_DLL ~UnsupportedOperationException() override;
+ //! @endcond
+};
+
+} // namespace util
+
+NS_PROJ_END
+
+#endif // UTIL_HH_INCLUDED