This repository has been archived on 2024-06-13. You can view files and clone it, but cannot push or open issues or pull requests.
2020-08-04 13:13:01 -04:00

170 lines
5.5 KiB
C++

//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
//=============================================================================
#ifndef DMXATTRIBUTE_H
#define DMXATTRIBUTE_H
#ifdef _WIN32
#pragma once
#endif
#include "datamodel/dmattributetypes.h"
#include "dmxloader/dmxloader.h"
#include "tier1/mempool.h"
#include "tier1/utlrbtree.h"
#include "tier1/utlsymbol.h"
#include "tier1/utlvector.h"
//-----------------------------------------------------------------------------
// Forward declarations:
//-----------------------------------------------------------------------------
class CDmxElement;
//-----------------------------------------------------------------------------
// Attribute info, modified for use in mod code
//-----------------------------------------------------------------------------
DECLARE_ATTRIBUTE_TYPE(CDmxElement *, AT_ELEMENT, "element", value = 0;)
DECLARE_ATTRIBUTE_ARRAY_TYPE(CDmxElement *, AT_ELEMENT_ARRAY, "element_array")
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
class CDmxAttribute {
DECLARE_DMX_ALLOCATOR();
public:
// Returns attribute name and type
DmAttributeType_t GetType() const;
const char *GetTypeString() const;
template <class T>
bool IsA() const;
// Returns the name. NOTE: The utlsymbol
// can be turned into a string by using g_pDataModel->String();
const char *GetName() const;
CUtlSymbol GetNameSymbol() const;
void SetName(const char *pName);
// Gets values
template <class T>
const T &GetValue() const;
template <class T>
const CUtlVector<T> &GetArray() const;
const char *GetValueString() const;
// Sets values (+ type)
template <class T>
void SetValue(const T &value);
void SetValue(const char *pString);
void SetValue(const void *pBuffer, size_t nLen);
void SetValue(const CDmxAttribute *pAttribute);
// Method to set values in an array (just directly operate on the array)
// NOTE: This will create a new array of the appropriate type if
// the type doesn't match the current type
template <class T>
CUtlVector<T> &GetArrayForEdit();
// Sets the attribute to its default value based on its type
void SetToDefaultValue();
// Convert to and from string
void SetValueFromString(const char *pValue);
const char *GetValueAsString(char *pBuffer, size_t nBufLen) const;
// Gets the size of an array, returns 0 if it's not an array type
int GetArrayCount() const;
// Read from file
bool Unserialize(DmAttributeType_t type, CUtlBuffer &buf);
bool UnserializeElement(DmAttributeType_t type, CUtlBuffer &buf);
bool Serialize(CUtlBuffer &buf) const;
bool SerializeElement(int nIndex, CUtlBuffer &buf) const;
bool SerializesOnMultipleLines() const;
// Returns the size of the variables storing the various attribute types
static int AttributeDataSize(DmAttributeType_t type);
private:
CDmxAttribute(const char *pAttributeName);
CDmxAttribute(CUtlSymbol attributeName);
~CDmxAttribute();
// Allocate, free memory for data
void AllocateDataMemory(DmAttributeType_t type);
void FreeDataMemory();
// Untyped method for setting used by unpack
void SetValue(DmAttributeType_t type, const void *pSrc, int nLen);
DmAttributeType_t m_Type;
CUtlSymbol m_Name;
void *m_pData;
static CUtlSymbolTableMT s_AttributeNameSymbols;
friend class CDmxElement;
};
//-----------------------------------------------------------------------------
// Inline methods
//-----------------------------------------------------------------------------
inline DmAttributeType_t CDmxAttribute::GetType() const { return m_Type; }
template <class T>
inline bool CDmxAttribute::IsA() const {
return GetType() == CDmAttributeInfo<T>::ATTRIBUTE_TYPE;
}
inline CUtlSymbol CDmxAttribute::GetNameSymbol() const { return m_Name; }
//-----------------------------------------------------------------------------
// Sets a value in the attribute
//-----------------------------------------------------------------------------
template <class T>
void CDmxAttribute::SetValue(const T &value) {
AllocateDataMemory(CDmAttributeInfo<T>::AttributeType());
CopyConstruct((T *)m_pData, value);
}
//-----------------------------------------------------------------------------
// Returns data in the attribute
//-----------------------------------------------------------------------------
inline const char *CDmxAttribute::GetValueString() const {
if (m_Type == AT_STRING) return *(CUtlString *)m_pData;
return "";
}
template <class T>
inline const T &CDmxAttribute::GetValue() const {
if (CDmAttributeInfo<T>::AttributeType() == m_Type) return *(T *)m_pData;
static T defaultValue;
CDmAttributeInfo<T>::SetDefaultValue(defaultValue);
return defaultValue;
}
template <class T>
inline const CUtlVector<T> &CDmxAttribute::GetArray() const {
if (CDmAttributeInfo<CUtlVector<T> >::AttributeType() == m_Type)
return *(CUtlVector<T> *)m_pData;
static CUtlVector<T> defaultArray;
return defaultArray;
}
template <class T>
inline CUtlVector<T> &CDmxAttribute::GetArrayForEdit() {
if (CDmAttributeInfo<CUtlVector<T> >::AttributeType() == m_Type)
return *(CUtlVector<T> *)m_pData;
AllocateDataMemory(CDmAttributeInfo<CUtlVector<T> >::AttributeType());
Construct((CUtlVector<T> *)m_pData);
return *(CUtlVector<T> *)m_pData;
}
#endif // DMXATTRIBUTE_H