omni/log/LogChannel.h

File members: omni/log/LogChannel.h

// Copyright (c) 2020-2022, NVIDIA CORPORATION. All rights reserved.
//
// NVIDIA CORPORATION and its licensors retain all intellectual property
// and proprietary rights in and to this software, related documentation
// and any modifications thereto. Any use, reproduction, disclosure or
// distribution of this software and related documentation without an express
// license agreement from NVIDIA CORPORATION is strictly prohibited.
//

#pragma once

#include <cstdint>
#include <vector>

#define OMNI_LOG_DECLARE_CHANNEL(varName_) extern omni::log::LogChannelData varName_;

#define OMNI_LOG_ADD_CHANNEL(varName_, channelName_, description_)                                                     \
    OMNI_LOG_DEFINE_CHANNEL_(varName_, channelName_, description_, true)

#define OMNI_LOG_DEFINE_CHANNEL(varName_, channelName_, description_)                                                  \
    OMNI_LOG_DEFINE_CHANNEL_(varName_, channelName_, description_, false)

#define OMNI_LOG_DEFINE_CHANNEL_(varName_, channelName_, description_, add_)                                           \
    omni::log::LogChannelData varName_{ channelName_, 0, description_, nullptr };                                      \
    omni::log::LogChannelRegistrar varName_##Registrar{ &varName_, add_ };

#ifndef OMNI_LOG_DEFAULT_CHANNEL

#    define OMNI_LOG_DEFAULT_CHANNEL kDefaultChannel

#endif

namespace omni
{
namespace log
{

#ifndef DOXYGEN_SHOULD_SKIP_THIS

struct LogChannelData
{
    const char* const name;
    int32_t level;
    const char* const description;
    LogChannelData* next;
};

#endif

inline LogChannelData*& getModuleLogChannels() noexcept
{
    static LogChannelData* sHead = nullptr;
    return sHead;
}

#ifndef DOXYGEN_SHOULD_SKIP_THIS

class LogChannelRegistrar
{
public:
    LogChannelRegistrar(LogChannelData* data, bool add) noexcept
    {
        if (add)
        {
            data->next = getModuleLogChannels();
            getModuleLogChannels() = data;
        }
    }
};

#endif

} // namespace log
} // namespace omni

#ifndef DOXYGEN_SHOULD_SKIP_THIS

#    define OMNI_LOG_DECLARE_DEFAULT_CHANNEL_1(chan_) OMNI_LOG_DECLARE_CHANNEL(chan_)
#    define OMNI_LOG_DECLARE_DEFAULT_CHANNEL() OMNI_LOG_DECLARE_DEFAULT_CHANNEL_1(OMNI_LOG_DEFAULT_CHANNEL)

// forward declare the default channel
OMNI_LOG_DECLARE_DEFAULT_CHANNEL()

#endif