mirror of
https://github.com/eclipse-openvehicle-api/openvehicle-api.git
synced 2026-02-05 15:18:45 +00:00
279 lines
10 KiB
C
279 lines
10 KiB
C
|
|
#ifndef SDV_INTERFACE_H
|
||
|
|
#define SDV_INTERFACE_H
|
||
|
|
|
||
|
|
#include <cstdint>
|
||
|
|
|
||
|
|
#ifndef interface
|
||
|
|
/** Define the interface keyword */
|
||
|
|
#define interface struct
|
||
|
|
#endif
|
||
|
|
|
||
|
|
namespace sdv
|
||
|
|
{
|
||
|
|
/**
|
||
|
|
* @brief Interface ID type
|
||
|
|
*/
|
||
|
|
using interface_id = uint64_t;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Get the interface ID.
|
||
|
|
* @tparam TIfc The interface type
|
||
|
|
* @return The ID of the interface
|
||
|
|
*/
|
||
|
|
template <typename TIfc>
|
||
|
|
constexpr inline interface_id GetInterfaceId() noexcept
|
||
|
|
{
|
||
|
|
// Return the interface ID.
|
||
|
|
return TIfc::_id;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Interface type class
|
||
|
|
*/
|
||
|
|
class interface_t
|
||
|
|
{
|
||
|
|
public:
|
||
|
|
/**
|
||
|
|
* @brief Default constructor
|
||
|
|
*/
|
||
|
|
interface_t() noexcept;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Copy constructor
|
||
|
|
* @param[in] rifc Reference to the interface to copy the pointer from.
|
||
|
|
*/
|
||
|
|
interface_t(const interface_t& rifc) noexcept;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Move constructor
|
||
|
|
* @param[in] rifc Reference to the interface to move the pointer from.
|
||
|
|
*/
|
||
|
|
interface_t(interface_t&& rifc) noexcept;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Null-pointer constructor
|
||
|
|
*/
|
||
|
|
interface_t(std::nullptr_t) noexcept;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Assignment constructor
|
||
|
|
* @tparam TInterface Interface type
|
||
|
|
* @param[in] pInterface Interface pointer
|
||
|
|
*/
|
||
|
|
template <typename TInterface>
|
||
|
|
interface_t(TInterface* pInterface) noexcept;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Copy assignment
|
||
|
|
* @param[in] rifc Reference to the interface to copy the pointer from.
|
||
|
|
* @return Reference to this interface type.
|
||
|
|
*/
|
||
|
|
interface_t& operator=(const interface_t& rifc) noexcept;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Move assignment
|
||
|
|
* @param[in] rifc Reference to the interface to move the pointer from.
|
||
|
|
* @return Reference to this interface type.
|
||
|
|
*/
|
||
|
|
interface_t& operator=(interface_t&& rifc) noexcept;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Null-pointer assignment
|
||
|
|
* @return Reference to this interface type.
|
||
|
|
*/
|
||
|
|
interface_t& operator=(std::nullptr_t) noexcept;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Interface assignment operator
|
||
|
|
* @tparam TInterface Interface type
|
||
|
|
* @param[in] pInterface Interface pointer
|
||
|
|
* @return Reference to this interface type.
|
||
|
|
*/
|
||
|
|
template <typename TInterface>
|
||
|
|
interface_t& operator=(TInterface* pInterface) noexcept;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Boolean cast operator. Returns whether an interface (!= nullptr) has been assigned.
|
||
|
|
* @return Returns 'true' when assigned; 'false' when not.
|
||
|
|
*/
|
||
|
|
operator bool() const noexcept;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Reset the interface pointer.
|
||
|
|
*/
|
||
|
|
void reset() noexcept;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Get the interface ID.
|
||
|
|
* @return The ID of the stored interface.
|
||
|
|
*/
|
||
|
|
interface_id id() const noexcept;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Get a pointer to the stored interface.
|
||
|
|
* @tparam TInterface The interface to get the pointer for.
|
||
|
|
* @return Returns the stored interface pointer if the ID of the requested interface corresponds to the stored interface.
|
||
|
|
* Returns a NULL-pointer if not.
|
||
|
|
*/
|
||
|
|
template <typename TInterface>
|
||
|
|
TInterface* get() noexcept;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Get a pointer to the stored interface.
|
||
|
|
* @tparam TInterface The interface to get the pointer for.
|
||
|
|
* @return Returns the stored interface pointer if the ID of the requested interface corresponds to the stored interface.
|
||
|
|
* Returns a NULL-pointer if not.
|
||
|
|
*/
|
||
|
|
template <typename TInterface>
|
||
|
|
const TInterface* get() const noexcept;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Compare the interface with another interface.
|
||
|
|
* @param[in] rifc Reference to the interface to compare with.
|
||
|
|
* @return Returns negative when the stored interface is smaller, 0 when the interfaces are equal and positive when the
|
||
|
|
* stored interface is larger.
|
||
|
|
*/
|
||
|
|
int compare(const interface_t& rifc) const noexcept;
|
||
|
|
|
||
|
|
private:
|
||
|
|
interface_id m_id = 0ull; ///< The interface ID of the stored interface.
|
||
|
|
void* m_pInterface = nullptr; ///< Interface pointer.
|
||
|
|
};
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Compare two interfaces for equality.
|
||
|
|
* @param[in] rifcLeft Reference to the left interface.
|
||
|
|
* @param[in] rifcRight Reference to the right interface.
|
||
|
|
* @return Returns whether both interfaces are equal.
|
||
|
|
*/
|
||
|
|
bool operator==(const interface_t& rifcLeft, const interface_t& rifcRight) noexcept;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Compare the interface for equality to NULL-pointer.
|
||
|
|
* @param[in] rifcLeft Reference to the left interface.
|
||
|
|
* @return Returns whether the interface is a NULL-pointer.
|
||
|
|
*/
|
||
|
|
bool operator==(const interface_t& rifcLeft, std::nullptr_t) noexcept;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Compare the interface for equality to NULL-pointer.
|
||
|
|
* @param[in] rifcRight Reference to the right interface.
|
||
|
|
* @return Returns whether the interface is a NULL-pointer.
|
||
|
|
*/
|
||
|
|
bool operator==(std::nullptr_t, const interface_t& rifcRight) noexcept;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Compare two interfaces for in-equality.
|
||
|
|
* @param[in] rifcLeft Reference to the left interface.
|
||
|
|
* @param[in] rifcRight Reference to the right interface.
|
||
|
|
* @return Returns whether both interfaces are not equal.
|
||
|
|
*/
|
||
|
|
bool operator!=(const interface_t& rifcLeft, const interface_t& rifcRight) noexcept;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Compare the interfaces for in-equality to NULL-pointer.
|
||
|
|
* @param[in] rifcLeft Reference to the left interface.
|
||
|
|
* @return Returns whether the interface is not a NULL-pointer.
|
||
|
|
*/
|
||
|
|
bool operator!=(const interface_t& rifcLeft, std::nullptr_t) noexcept;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Compare the interfaces for in-equality to NULL-pointer.
|
||
|
|
* @param[in] rifcRight Reference to the right interface.
|
||
|
|
* @return Returns whether the interface is not a NULL-pointer.
|
||
|
|
*/
|
||
|
|
bool operator!=(std::nullptr_t, const interface_t& rifcRight) noexcept;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Compare whether the left interface is smaller than the right interface.
|
||
|
|
* @param[in] rifcLeft Reference to the left interface.
|
||
|
|
* @param[in] rifcRight Reference to the right interface.
|
||
|
|
* @return Returns whether the left interface is smaller.
|
||
|
|
*/
|
||
|
|
bool operator<(const interface_t& rifcLeft, const interface_t& rifcRight) noexcept;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Compare whether the left interface is smaller than a NULL-pointer.
|
||
|
|
* @param[in] rifcLeft Reference to the left interface.
|
||
|
|
* @return Returns whether the left interface is smaller.
|
||
|
|
*/
|
||
|
|
bool operator<(const interface_t& rifcLeft, std::nullptr_t) noexcept;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Compare whether a NULL-pointer is smaller than the right interface.
|
||
|
|
* @param[in] rifcRight Reference to the right interface.
|
||
|
|
* @return Returns whether the NULL-pointer is smaller.
|
||
|
|
*/
|
||
|
|
bool operator<(std::nullptr_t, const interface_t& rifcRight) noexcept;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Compare whether the left interface is smaller than or equal to the right interface.
|
||
|
|
* @param[in] rifcLeft Reference to the left interface.
|
||
|
|
* @param[in] rifcRight Reference to the right interface.
|
||
|
|
* @return Returns whether the left interface is smaller or equal.
|
||
|
|
*/
|
||
|
|
bool operator<=(const interface_t& rifcLeft, const interface_t& rifcRight) noexcept;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Compare whether the left interface is smaller than or equal to a NULL-pointer.
|
||
|
|
* @param[in] rifcLeft Reference to the left interface.
|
||
|
|
* @return Returns whether the left interface is smaller.
|
||
|
|
*/
|
||
|
|
bool operator<=(const interface_t& rifcLeft, std::nullptr_t) noexcept;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Compare whether a NULL-pointer is smaller than or equal to the right interface.
|
||
|
|
* @param[in] rifcRight Reference to the right interface.
|
||
|
|
* @return Returns whether the NULL-pointer is smaller or equal.
|
||
|
|
*/
|
||
|
|
bool operator<=(std::nullptr_t, const interface_t& rifcRight) noexcept;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Compare whether the left interface is larger than the right interface.
|
||
|
|
* @param[in] rifcLeft Reference to the left interface.
|
||
|
|
* @param[in] rifcRight Reference to the right interface.
|
||
|
|
* @return Returns whether the left interface is larger.
|
||
|
|
*/
|
||
|
|
bool operator>(const interface_t& rifcLeft, const interface_t& rifcRight) noexcept;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Compare whether the left interface is larger than a NULL-pointer.
|
||
|
|
* @param[in] rifcLeft Reference to the left interface.
|
||
|
|
* @return Returns whether the left interface is larger.
|
||
|
|
*/
|
||
|
|
bool operator>(const interface_t& rifcLeft, std::nullptr_t) noexcept;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Compare whether a NULL-pointer is larger than the right interface.
|
||
|
|
* @param[in] rifcRight Reference to the right interface.
|
||
|
|
* @return Returns whether the NULL-pointer is larger.
|
||
|
|
*/
|
||
|
|
bool operator>(std::nullptr_t, const interface_t& rifcRight) noexcept;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Compare whether the left interface is larger than or equal to the right interface.
|
||
|
|
* @param[in] rifcLeft Reference to the left interface.
|
||
|
|
* @param[in] rifcRight Reference to the right interface.
|
||
|
|
* @return Returns whether the left interface is larger or equal.
|
||
|
|
*/
|
||
|
|
bool operator>=(const interface_t& rifcLeft, const interface_t& rifcRight) noexcept;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Compare whether the left interface is larger than or equal to a NULL-pointer.
|
||
|
|
* @param[in] rifcLeft Reference to the left interface.
|
||
|
|
* @return Returns whether the left interface is larger or equal.
|
||
|
|
*/
|
||
|
|
bool operator>=(const interface_t& rifcLeft, std::nullptr_t) noexcept;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Compare whether a NULL-pointer is larger than or equal to the right interface.
|
||
|
|
* @param[in] rifcRight Reference to the right interface.
|
||
|
|
* @return Returns whether the NULL-pointer larger or equal.
|
||
|
|
*/
|
||
|
|
bool operator>=(std::nullptr_t, const interface_t& rifcRight) noexcept;
|
||
|
|
|
||
|
|
} // namespace idl
|
||
|
|
|
||
|
|
#include "interface.inl"
|
||
|
|
|
||
|
|
#endif // !defined SDV_INTERFACE_H
|