IDictionaryCommon.h#

Fully qualified name: carb/dictionary/detail/IDictionaryCommon.h

File members: carb/dictionary/detail/IDictionaryCommon.h

// SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
// SPDX-License-Identifier: LicenseRef-NvidiaProprietary
//
// NVIDIA CORPORATION, its affiliates and licensors retain all intellectual
// property and proprietary rights in and to this material, related
// documentation and any modifications thereto. Any use, reproduction,
// disclosure or distribution of this material and related documentation
// without an express license agreement from NVIDIA CORPORATION or
// its affiliates is strictly prohibited.

// purposely missing #pragma once

#ifdef DOXYGEN_BUILD
#    include "../../Defines.h"

namespace carb::dictionary
{
#endif

class ScopedWrite
{
    const IDictionary& m_dictionary;
    Item* m_pItem;

public:
    ScopedWrite(const IDictionary& dictionary, Item* item) : m_dictionary(dictionary), m_pItem(item)
    {
        m_dictionary.writeLock(item);
    }
    ~ScopedWrite()
    {
        m_dictionary.unlock(m_pItem);
    }
    CARB_PREVENT_COPY_AND_MOVE(ScopedWrite);
};

class ScopedRead
{
    const IDictionary& m_dictionary;
    const Item* m_pItem;

public:
    ScopedRead(const IDictionary& dictionary, const Item* item) : m_dictionary(dictionary), m_pItem(item)
    {
        m_dictionary.readLock(item);
    }
    ~ScopedRead()
    {
        m_dictionary.unlock(m_pItem);
    }
    CARB_PREVENT_COPY_AND_MOVE(ScopedRead);
};

inline int32_t IDictionary::getAsInt(const Item* item) CARBLOCAL_CONST
{
    auto val = getAsInt64(item);
    CARB_ASSERT(val >= INT_MIN && val <= INT_MAX);
    return int32_t(val);
}

inline void IDictionary::setInt(Item* item, int32_t value) CARBLOCAL_CONST
{
    setInt64(item, static_cast<int64_t>(value));
}

inline float IDictionary::getAsFloat(const Item* item) CARBLOCAL_CONST
{
    return static_cast<float>(getAsFloat64(item));
}

inline void IDictionary::setFloat(Item* item, float value) CARBLOCAL_CONST
{
    setFloat64(item, static_cast<double>(value));
}

inline int32_t IDictionary::getAsIntAt(const Item* item, size_t index) CARBLOCAL_CONST
{
    auto val = getAsInt64At(item, index);
    CARB_ASSERT(val >= INT_MIN && val <= INT_MAX);
    return int32_t(val);
}

inline void IDictionary::setIntAt(Item* item, size_t index, int32_t value) CARBLOCAL_CONST
{
    setInt64At(item, index, static_cast<int64_t>(value));
}

inline float IDictionary::getAsFloatAt(const Item* item, size_t index) CARBLOCAL_CONST
{
    return static_cast<float>(getAsFloat64At(item, index));
}

inline void IDictionary::setFloatAt(Item* item, size_t index, float value) CARBLOCAL_CONST
{
    setFloat64At(item, index, static_cast<double>(value));
}

#ifndef DOXYGEN_BUILD
template <>
inline bool IDictionary::get<bool>(const Item* item) CARBLOCAL_CONST
{
    return getAsBool(item);
}

template <>
inline int32_t IDictionary::get<int32_t>(const Item* item) CARBLOCAL_CONST
{
    return getAsInt(item);
}

template <>
inline int64_t IDictionary::get<int64_t>(const Item* item) CARBLOCAL_CONST
{
    return getAsInt64(item);
}

template <>
inline float IDictionary::get<float>(const Item* item) CARBLOCAL_CONST
{
    return getAsFloat(item);
}

template <>
inline double IDictionary::get<double>(const Item* item) CARBLOCAL_CONST
{
    return getAsFloat64(item);
}

template <>
inline Int2 IDictionary::get<Int2>(const Item* item) CARBLOCAL_CONST
{
    Int2 value;
    getAsIntArray(item, &value.x, 2);
    return value;
}

template <>
inline Int3 IDictionary::get<Int3>(const Item* item) CARBLOCAL_CONST
{
    Int3 value;
    getAsIntArray(item, &value.x, 3);
    return value;
}

template <>
inline Int4 IDictionary::get<Int4>(const Item* item) CARBLOCAL_CONST
{
    Int4 value;
    getAsIntArray(item, &value.x, 4);
    return value;
}

template <>
inline Uint2 IDictionary::get<Uint2>(const Item* item) CARBLOCAL_CONST
{
    int64_t value[2];
    getAsInt64Array(item, value, 2);
    return { static_cast<uint32_t>(value[0]), static_cast<uint32_t>(value[1]) };
}

template <>
inline Uint3 IDictionary::get<Uint3>(const Item* item) CARBLOCAL_CONST
{
    int64_t value[3];
    getAsInt64Array(item, value, 3);
    return { static_cast<uint32_t>(value[0]), static_cast<uint32_t>(value[1]), static_cast<uint32_t>(value[2]) };
}

template <>
inline Uint4 IDictionary::get<Uint4>(const Item* item) CARBLOCAL_CONST
{
    int64_t value[4];
    getAsInt64Array(item, value, 4);
    return { static_cast<uint32_t>(value[0]), static_cast<uint32_t>(value[1]), static_cast<uint32_t>(value[2]),
             static_cast<uint32_t>(value[3]) };
}

template <>
inline Float2 IDictionary::get<Float2>(const Item* item) CARBLOCAL_CONST
{
    Float2 value;
    getAsFloatArray(item, &value.x, 2);
    return value;
}

template <>
inline Float3 IDictionary::get<Float3>(const Item* item) CARBLOCAL_CONST
{
    Float3 value;
    getAsFloatArray(item, &value.x, 3);
    return value;
}

template <>
inline Float4 IDictionary::get<Float4>(const Item* item) CARBLOCAL_CONST
{
    Float4 value;
    getAsFloatArray(item, &value.x, 4);
    return value;
}

template <>
inline Double2 IDictionary::get<Double2>(const Item* item) CARBLOCAL_CONST
{
    Double2 value;
    getAsFloat64Array(item, &value.x, 2);
    return value;
}

template <>
inline Double3 IDictionary::get<Double3>(const Item* item) CARBLOCAL_CONST
{
    Double3 value;
    getAsFloat64Array(item, &value.x, 3);
    return value;
}

template <>
inline Double4 IDictionary::get<Double4>(const Item* item) CARBLOCAL_CONST
{
    Double4 value;
    getAsFloat64Array(item, &value.x, 4);
    return value;
}

inline void IDictionary::copyItemFlags(Item* dstItem, const Item* srcItem) CARBLOCAL_CONST
{
    setItemFlag(dstItem, ItemFlag::eUnitSubtree, getItemFlag(srcItem, ItemFlag::eUnitSubtree));
}

#endif

#ifdef DOXYGEN_BUILD
} // namespace carb::dictionary
#endif