/* * Copyright (c) 2016-2021, NVIDIA CORPORATION. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of NVIDIA CORPORATION nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @file * Libargus API: UUID API * * @b Description: Defines the UUID types used by libargus. */ #ifndef _ARGUS_UUID_H #define _ARGUS_UUID_H #include #include namespace Argus { const uint32_t MAX_UUID_NAME_SIZE = 32; /** * A universally unique identifier. */ struct UUID { uint32_t time_low; uint16_t time_mid; uint16_t time_hi_and_version; uint16_t clock_seq; uint8_t node[6]; bool operator==(const UUID &r) const { return memcmp(this, &r, sizeof(UUID)) == 0; } bool operator<(const UUID &r) const { return memcmp(this, &r, sizeof(UUID)) < 0; } }; /** * A universally unique identifier with a name (used for debugging purposes). */ class NamedUUID : public UUID { public: NamedUUID(uint32_t time_low_ , uint16_t time_mid_ , uint16_t time_hi_and_version_ , uint16_t clock_seq_ , uint8_t c0, uint8_t c1, uint8_t c2, uint8_t c3, uint8_t c4, uint8_t c5 , const char* name) { time_low = time_low_; time_mid = time_mid_; time_hi_and_version = time_hi_and_version_; clock_seq = clock_seq_; node[0] = c0; node[1] = c1; node[2] = c2; node[3] = c3; node[4] = c4; node[5] = c5; strncpy(m_name, name, sizeof(m_name)-1); m_name[sizeof(m_name)-1] = '\0'; } NamedUUID(const NamedUUID& copied) : UUID(copied) { memcpy(m_name, copied.m_name, (strnlen(copied.m_name, (sizeof(m_name) - 1)) + 1)); m_name[sizeof(m_name)-1] = '\0'; } NamedUUID& operator=(const NamedUUID& copied) { static_cast(*this) = copied; return *this; } bool operator==(const NamedUUID& compared) const { return static_cast(*this) == compared; } bool operator!=(const NamedUUID& compared) const { return !(static_cast(*this) == compared); } const char* getName() const { return m_name; } private: char m_name[MAX_UUID_NAME_SIZE]; NamedUUID(); }; /// Helper macro used to define NamedUUID-derived values. #define DEFINE_UUID(TYPE, NAME, l, s0, s1, s2, c0,c1,c2,c3,c4,c5) \ static const TYPE NAME(0x##l, 0x##s0, 0x##s1, 0x##s2, \ 0x##c0, 0x##c1, 0x##c2, 0x##c3, 0x##c4, 0x##c5, #NAME); #define DEFINE_NAMED_UUID_CLASS(NAME) \ class NAME : public NamedUUID \ { \ public: \ NAME(uint32_t time_low_ \ , uint16_t time_mid_ \ , uint16_t time_hi_and_version_ \ , uint16_t clock_seq_ \ , uint8_t c0, uint8_t c1, uint8_t c2, uint8_t c3, uint8_t c4, uint8_t c5 \ , const char* name) \ : NamedUUID(time_low_, time_mid_, time_hi_and_version_, clock_seq_, \ c0, c1, c2, c3, c4, c5, name) \ {} \ private: \ NAME();\ }; } // namespace Argus #endif // _ARGUS_UUID_H