flipperzero-firmware/lib/app-scened-template/typeindex_no_rtti.hpp
SG b9a766d909 [FL-2627] Flipper applications: SDK, build and debug system (#1387)
* Added support for running applications from SD card (FAPs - Flipper Application Packages)
* Added plugin_dist target for fbt to build FAPs
* All apps of type FlipperAppType.EXTERNAL and FlipperAppType.PLUGIN are built as FAPs by default
* Updated VSCode configuration for new fbt features - re-deploy stock configuration to use them
* Added debugging support for FAPs with fbt debug & VSCode
* Added public firmware API with automated versioning

Co-authored-by: hedger <hedger@users.noreply.github.com>
Co-authored-by: SG <who.just.the.doctor@gmail.com>
Co-authored-by: あく <alleteam@gmail.com>
2022-09-15 02:21:03 +09:00

129 lines
3.5 KiB
C++

/*
* type_index without RTTI
*
* Copyright frickiericker 2016.
* Distributed under the Boost Software License, Version 1.0.
*
* Permission is hereby granted, free of charge, to any person or organization
* obtaining a copy of the software and accompanying documentation covered by
* this license (the "Software") to use, reproduce, display, distribute,
* execute, and transmit the Software, and to prepare derivative works of the
* Software, and to permit third-parties to whom the Software is furnished to
* do so, all subject to the following:
*
* The copyright notices in the Software and this entire statement, including
* the above license grant, this restriction and the following disclaimer,
* must be included in all copies of the Software, in whole or in part, and
* all derivative works of the Software, unless such copies or derivative
* works are solely in the form of machine-executable object code generated by
* a source language processor.
*
* 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, TITLE AND NON-INFRINGEMENT. IN NO EVENT
* SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
* FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
#include <functional>
namespace ext {
/**
* Dummy type for tag-dispatching.
*/
template <typename T>
struct tag_type {};
/**
* A value of tag_type<T>.
*/
template <typename T>
constexpr tag_type<T> tag{};
/**
* A type_index implementation without RTTI.
*/
struct type_index {
/**
* Creates a type_index object for the specified type.
*/
template <typename T>
type_index(tag_type<T>) noexcept : hash_code_{index<T>} {
}
/**
* Returns the hash code.
*/
std::size_t hash_code() const noexcept {
return hash_code_;
}
private:
/**
* Unique integral index associated to template type argument.
*/
template <typename T>
static std::size_t const index;
/**
* Global counter for generating index values.
*/
static std::size_t& counter() noexcept {
static std::size_t counter_;
return counter_;
}
private:
std::size_t hash_code_;
};
template <typename>
std::size_t const type_index::index = type_index::counter()++;
/**
* Creates a type_index object for the specified type.
*
* Equivalent to `ext::type_index{ext::tag<T>}`.
*/
template <typename T>
type_index make_type_index() noexcept {
return tag<T>;
}
inline bool operator==(type_index const& a, type_index const& b) noexcept {
return a.hash_code() == b.hash_code();
}
inline bool operator!=(type_index const& a, type_index const& b) noexcept {
return !(a == b);
}
inline bool operator<(type_index const& a, type_index const& b) noexcept {
return a.hash_code() < b.hash_code();
}
inline bool operator<=(type_index const& a, type_index const& b) noexcept {
return a.hash_code() <= b.hash_code();
}
inline bool operator>(type_index const& a, type_index const& b) noexcept {
return !(a <= b);
}
inline bool operator>=(type_index const& a, type_index const& b) noexcept {
return !(a < b);
}
}
template <>
struct std::hash<ext::type_index> {
using argument_type = ext::type_index;
using result_type = std::size_t;
result_type operator()(argument_type const& t) const noexcept {
return t.hash_code();
}
};