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

1390 lines
41 KiB
C++

//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
//=============================================================================
#ifndef DMATTRIBUTEVAR_H
#define DMATTRIBUTEVAR_H
#ifdef _WIN32
#pragma once
#endif
#include "Color.h"
#include "datamodel/dmattribute.h"
#include "datamodel/dmelement.h"
#include "mathlib/vector.h"
#include "mathlib/vector2d.h"
#include "mathlib/vector4d.h"
#include "mathlib/vmatrix.h"
#include "tier1/utlvector.h"
template <class C, bool D>
class CDmeHandle;
//-----------------------------------------------------------------------------
// Specialization for color
//-----------------------------------------------------------------------------
class CDmaColor : public CDmaVar<Color> {
public:
// Set methods
void SetColor(int r, int g, int b, int a = 0);
void SetRed(int r);
void SetGreen(int g);
void SetBlue(int b);
void SetAlpha(int a);
// Sets the color as a 32-bit integer
void SetRawColor(int color);
// Get methods
unsigned char r() const;
unsigned char g() const;
unsigned char b() const;
unsigned char a() const;
const unsigned char &operator[](int index) const;
};
//-----------------------------------------------------------------------------
// Specialization for object ids
//-----------------------------------------------------------------------------
class CDmaObjectId : public CDmaVar<DmObjectId_t> {
public:
void CreateObjectId();
void Invalidate();
bool IsValid() const;
bool IsEqual(const DmObjectId_t &id) const;
const DmObjectId_t &operator=(const DmObjectId_t &src);
const CDmaObjectId &operator=(const CDmaObjectId &src);
const DmObjectId_t &Set(const DmObjectId_t &src);
};
//-----------------------------------------------------------------------------
// Specialization for binary block
//-----------------------------------------------------------------------------
class CDmaBinaryBlock : public CDmaVar<CUtlBinaryBlock> {
public:
void Get(void *pValue, int nMaxLen) const;
void Set(const void *pValue, int nLen);
const void *Get() const;
const unsigned char &operator[](int i) const;
// Returns buffer length
int Length() const;
};
//-----------------------------------------------------------------------------
// Specialization for elements
//-----------------------------------------------------------------------------
template <class T>
class CDmaElement : public CDmaVar<DmElementHandle_t> {
typedef CDmaVar<DmElementHandle_t> BaseClass;
public:
// Used to initialize the attribute in an element's OnConstruction method
void InitAndCreate(CDmElement *pOwner, const char *pAttributeName,
const char *pElementName = NULL, int flags = 0);
void Init(CDmElement *pOwner, const char *pAttributeName, int flags = 0);
// Returns the type of elements allowed into this attribute.
// UTL_INVAL_SYMBOL allows everything.
UtlSymId_t GetElementType() const;
// Get/set
void Set(T *pElement);
T *GetElement() const;
// Cast
T *operator->() const;
operator T *() const;
// NULL check
bool operator!() const;
// Assignment.. wish I knew how to un-inline these methods
template <class S>
CDmaElement<T> &operator=(S *pElement) {
Set(static_cast<T *>(pElement));
return *this;
}
template <class S>
CDmaElement<T> &operator=(const CDmaElement<S> &src) {
Set(static_cast<T *>(src.Get()));
return *this;
}
template <class S>
bool operator==(const CDmaElement<S> &src) const {
return Value() == src.Value();
}
template <class S>
bool operator!=(const CDmaElement<S> &src) const {
return Value() != src.Value();
}
};
//-----------------------------------------------------------------------------
// Can access any array attribute, regardless of type
// See below for type-specific array accessors which have more features
//-----------------------------------------------------------------------------
class CDmrGenericArrayConst {
public:
CDmrGenericArrayConst(const CDmAttribute *pAttribute);
CDmrGenericArrayConst(const CDmElement *pElement,
const char *pAttributeName);
// Array count
int Count() const;
// Gets
const void *GetUntyped(int i) const;
// String conversion
const char *GetAsString(int i, char *pBuffer, size_t nBufLen) const;
const CDmAttribute *GetAttribute() const;
bool IsValid() const;
protected:
CDmrGenericArrayConst();
void Init(const CDmAttribute *pAttribute);
void Init(const CDmElement *pElement, const char *pAttributeName);
CDmAttribute *m_pAttribute;
};
class CDmrGenericArray : public CDmrGenericArrayConst {
public:
CDmrGenericArray(CDmAttribute *pAttribute);
CDmrGenericArray(CDmElement *pElement, const char *pAttributeName);
void EnsureCount(int num);
// Sets multiple elements at the same time
int AddToTail();
void Remove(int elem); // preserves order, shifts elements
void RemoveAll(); // doesn't deallocate memory
void SetMultiple(int i, int nCount, DmAttributeType_t valueType,
const void *pValue);
void Set(int i, DmAttributeType_t valueType, const void *pValue);
// String conversion
void SetFromString(int i, const char *pValue);
CDmAttribute *GetAttribute();
const CDmAttribute *GetAttribute() const;
};
//-----------------------------------------------------------------------------
// Helper template for external array attribute vars
// NOTE: To use this class, don't use CDmaArrayBase directly. Instead, use
// CDmaArray<T> var; <- Instantiate an array attribute var as a
//member of a element class CDmrArray<T> var; <- Used to reference an existing
//array attribute + read/modify it CDmrArrayConst<T> var; <- Used to
//reference an existing array attribute + read it (no modify)
//
// Also, there is a CDmaStringArray/CDmrStringArray/CDmrStringArrayConst for
// strings and a CDmaElementArray/CDmrElementArray/CDmrElementArrayConst for
// elements
//-----------------------------------------------------------------------------
template <class T, class B>
class CDmaArrayConstBase : public B {
public:
// Accessors
const CUtlVector<T> &Get() const;
const T *Base() const;
// Iteration
int Count() const;
const T &operator[](int i) const;
const T &Element(int i) const;
const T &Get(int i) const;
const void *GetUntyped(int i) const;
bool IsValidIndex(int i) const;
int InvalidIndex(void) const;
// Search
int Find(const T &value) const;
// Attribute-related methods
const CDmAttribute *GetAttribute() const;
CDmElement *GetOwner();
bool IsDirty() const;
protected:
CDmaArrayConstBase();
CDmAttribute *m_pAttribute;
};
template <class T, class B>
class CDmaArrayBase : public CDmaArrayConstBase<T, B> {
public:
// Insertion
int AddToTail();
int InsertBefore(int elem);
int AddToTail(const T &src);
int InsertBefore(int elem, const T &src);
int AddMultipleToTail(int num);
int InsertMultipleBefore(int elem, int num);
void EnsureCount(int num);
// Element Modification
void Set(int i, const T &value);
void SetMultiple(int i, int nCount, const T *pValue);
void Swap(int i, int j);
// Copy related methods
void CopyArray(const T *pArray, int size);
// this is basically just a faster version of CopyArray which uses pointer
// swap NOTE: This doesn't work for element arrays
void SwapArray(CUtlVector<T> &array);
// Removal
void FastRemove(int elem);
void Remove(int elem);
void RemoveMultiple(int elem, int num);
void RemoveAll();
// Memory management
void EnsureCapacity(int num);
void Purge();
// Attribute-related methods
CDmAttribute *GetAttribute();
const CDmAttribute *GetAttribute() const;
};
//-----------------------------------------------------------------------------
// Specialization for string arrays
// NOTE: To use this class, don't use CDmaStringArrayBase directly. Instead, use
// CDmaStringArray var; <- Instantiate an array attribute var as
//a member of a element class CDmrStringArray var; <- Used to reference an
//existing array attribute + read/modify it CDmrStringArrayConst var; <- Used to
//reference an existing array attribute + read it (no modify)
//-----------------------------------------------------------------------------
template <class BaseClass>
class CDmaStringArrayConstBase : public BaseClass {
public:
const char *operator[](int i) const;
const char *Element(int i) const;
const char *Get(int i) const;
const CUtlVector<CUtlString> &Get() const;
// Returns strlen of element i
int Length(int i) const;
};
template <class B>
class CDmaStringArrayBase
: public CDmaStringArrayConstBase<CDmaArrayBase<CUtlString, B> > {
typedef CDmaStringArrayConstBase<CDmaArrayBase<CUtlString, B> > BaseClass;
public:
// Sets an element in the array
void Set(int i, const char *pValue);
// Adds an element, uses copy constructor
int AddToTail(const char *pValue);
int InsertBefore(int elem, const char *pValue);
};
//-----------------------------------------------------------------------------
// Specialization for elements
// NOTE: To use this class, don't use CDmaElementArrayBase directly. Instead,
// use
// CDmaElementArray< element_type > var; <- Instantiate an array
//attribute var as a member of a element class CDmrElementArray< element_type >
//var; <- Used to reference an existing array attribute + read/modify it
// CDmrElementArrayConst< element_type > var; <- Used to reference an
//existing array attribute + read it (no modify)
//-----------------------------------------------------------------------------
template <class E, class BaseClass>
class CDmaElementArrayConstBase : public BaseClass {
public:
// Returns the element type
UtlSymId_t GetElementType() const;
// Array access
E *operator[](int i) const;
E *Element(int i) const;
E *Get(int i) const;
const DmElementHandle_t &GetHandle(int i) const;
const CUtlVector<DmElementHandle_t> &Get() const;
// Search
int Find(const E *pValue) const;
int Find(DmElementHandle_t h) const;
};
template <class E, class B>
class CDmaElementArrayBase
: public CDmaElementArrayConstBase<E,
CDmaArrayBase<DmElementHandle_t, B> > {
typedef CDmaElementArrayConstBase<E, CDmaArrayBase<DmElementHandle_t, B> >
BaseClass;
public:
void SetHandle(int i, DmElementHandle_t h);
void Set(int i, E *pElement);
// Insertion
int AddToTail();
int AddToTail(DmElementHandle_t src);
int AddToTail(E *pValue);
int InsertBefore(int elem);
int InsertBefore(int elem, DmElementHandle_t src);
int InsertBefore(int elem, E *pValue);
template <class C, bool D>
int AddToTail(const CDmeHandle<C, D> &value) {
return BaseClass::AddToTail(value.GetHandle());
}
template <class C, bool D>
int InsertBefore(int elem, const CDmeHandle<C, D> &value) {
return BaseClass::InsertBefore(elem, value.GetHandle());
}
};
// NOTE: The next couple classes are implementation details used to create
// CDmrAray/CDmaArray
//-----------------------------------------------------------------------------
// Base classes that contain data or refer to it; used for array accessor
// classes
//-----------------------------------------------------------------------------
template <typename T>
class CDmaDataInternal {
protected:
typedef typename CDmAttributeInfo<T>::StorageType_t D;
const T &Value() const { return m_Storage; }
T &Value() { return m_Storage; }
const D &Data() const { return m_Storage; }
D &Data() { return m_Storage; }
private:
D m_Storage;
};
template <typename T>
class CDmaDataExternal {
protected:
typedef typename CDmAttributeInfo<T>::StorageType_t D;
CDmaDataExternal() : m_pStorage(0) {}
void Attach(void *pData) { m_pStorage = (D *)pData; }
const T &Value() const { return *m_pStorage; }
T &Value() { return *m_pStorage; }
const D &Data() const { return *m_pStorage; }
D &Data() { return *m_pStorage; }
private:
D *m_pStorage;
};
//-----------------------------------------------------------------------------
// Versions for access, or for attribute vars
//-----------------------------------------------------------------------------
template <class T, class B>
class CDmaDecorator : public B {
public:
void Init(CDmElement *pOwner, const char *pAttributeName, int flags = 0);
};
template <class T, class BaseClass>
class CDmrDecoratorConst : public BaseClass {
public:
void Init(const CDmAttribute *pAttribute);
void Init(const CDmElement *pElement, const char *pAttributeName);
bool IsValid() const;
};
template <class T, class BaseClass>
class CDmrDecorator : public BaseClass {
public:
void Init(CDmAttribute *pAttribute);
void Init(CDmElement *pElement, const char *pAttributeName,
bool bAddAttribute = false);
bool IsValid() const;
};
#define DECLARE_ATTRIBUTE_ARRAY_VARIABLE(_className, _elementType) \
public: \
_className() {}
#define DECLARE_ATTRIBUTE_ARRAY_REFERENCE(_className, _elementType) \
public: \
_className() {} \
_className(CDmAttribute *pAttribute) { BaseClass::Init(pAttribute); } \
_className(CDmElement *pElement, const char *pAttributeName, \
bool bAddAttribute = false) { \
BaseClass::Init(pElement, pAttributeName, bAddAttribute); \
} \
_className(CDmaArray<_className> &var) { \
BaseClass::Init(var.GetAttribute()); \
} \
_className(CDmrArray<_className> &var) { \
BaseClass::Init(var.GetAttribute()); \
}
#define DECLARE_ATTRIBUTE_ARRAY_CONST_REFERENCE(_className, _elementType) \
public: \
_className() {} \
_className(const CDmAttribute *pAttribute) { \
BaseClass::Init(pAttribute); \
} \
_className(const CDmElement *pElement, const char *pAttributeName) { \
BaseClass::Init(pElement, pAttributeName); \
} \
_className(const CDmaArray<_className> &var) { \
BaseClass::Init(var.GetAttribute()); \
} \
_className(const CDmrArrayConst<_className> &var) { \
BaseClass::Init(var.GetAttribute()); \
} \
_className(const CDmrArray<_className> &var) { \
BaseClass::Init(var.GetAttribute()); \
}
template <class T>
class CDmrArray;
template <class T>
class CDmrArrayConst;
template <class T>
class CDmaArray;
//-----------------------------------------------------------------------------
// Versions for access, or for attribute vars
//-----------------------------------------------------------------------------
template <class T>
class CDmaArray : public CDmaDecorator<
T, CDmaArrayBase<T, CDmaDataInternal<CUtlVector<T> > > > {
DECLARE_ATTRIBUTE_ARRAY_VARIABLE(CDmaArray, T);
public:
const CDmaArray<T> &operator=(const CDmaArray<T> &val) {
CopyArray(val.Base(), val.Count());
return *this;
}
template <class C>
const CDmaArray<T> &operator=(const C &val) {
CopyArray(val.Base(), val.Count());
return *this;
}
private:
CDmaArray(const CDmaArray &array) {}
};
template <class T>
class CDmrArrayConst
: public CDmrDecoratorConst<
T, CDmaArrayConstBase<T, CDmaDataExternal<CUtlVector<T> > > > {
typedef CDmrDecoratorConst<
T, CDmaArrayConstBase<T, CDmaDataExternal<CUtlVector<T> > > >
BaseClass;
DECLARE_ATTRIBUTE_ARRAY_CONST_REFERENCE(CDmrArrayConst, T);
};
template <class T>
class CDmrArray : public CDmrDecorator<
T, CDmaArrayBase<T, CDmaDataExternal<CUtlVector<T> > > > {
typedef CDmrDecorator<T,
CDmaArrayBase<T, CDmaDataExternal<CUtlVector<T> > > >
BaseClass;
DECLARE_ATTRIBUTE_ARRAY_REFERENCE(CDmrArray, T);
public:
const CDmrArray<T> &operator=(const CDmrArray<T> &val) {
CopyArray(val.Base(), val.Count());
return *this;
}
template <class C>
const CDmrArray<T> &operator=(const C &val) {
CopyArray(val.Base(), val.Count());
return *this;
}
};
class CDmrStringArray;
class CDmaStringArray
: public CDmaDecorator<
CUtlString,
CDmaStringArrayBase<CDmaDataInternal<CUtlVector<CUtlString> > > > {
DECLARE_ATTRIBUTE_ARRAY_VARIABLE(CDmaStringArray, CUtlString);
public:
const CDmaStringArray &operator=(const CDmaStringArray &val) {
CopyArray(val.Base(), val.Count());
return *this;
}
template <class C>
const CDmaStringArray &operator=(const C &val) {
CopyArray(val.Base(), val.Count());
return *this;
}
private:
CDmaStringArray(const CDmaStringArray &array) {}
};
class CDmrStringArray
: public CDmrDecorator<
CUtlString,
CDmaStringArrayBase<CDmaDataExternal<CUtlVector<CUtlString> > > > {
typedef CDmrDecorator<
CUtlString,
CDmaStringArrayBase<CDmaDataExternal<CUtlVector<CUtlString> > > >
BaseClass;
DECLARE_ATTRIBUTE_ARRAY_REFERENCE(CDmrStringArray, CUtlString);
public:
CDmrStringArray(CDmaStringArray &var) { Init(var.GetAttribute()); }
CDmrStringArray(CDmrStringArray &var) { Init(var.GetAttribute()); }
const CDmrStringArray &operator=(const CDmrStringArray &val) {
CopyArray(val.Base(), val.Count());
return *this;
}
template <class C>
const CDmrStringArray &operator=(const C &val) {
CopyArray(val.Base(), val.Count());
return *this;
}
};
class CDmrStringArrayConst
: public CDmrDecoratorConst<
CUtlString,
CDmaStringArrayConstBase<CDmaArrayConstBase<
CUtlString, CDmaDataExternal<CUtlVector<CUtlString> > > > > {
typedef CDmrDecoratorConst<
CUtlString,
CDmaStringArrayConstBase<CDmaArrayConstBase<
CUtlString, CDmaDataExternal<CUtlVector<CUtlString> > > > >
BaseClass;
DECLARE_ATTRIBUTE_ARRAY_CONST_REFERENCE(CDmrStringArrayConst, CUtlString);
public:
CDmrStringArrayConst(const CDmaStringArray &var) {
Init(var.GetAttribute());
}
CDmrStringArrayConst(const CDmrStringArray &var) {
Init(var.GetAttribute());
}
CDmrStringArrayConst(const CDmrStringArrayConst &var) {
Init(var.GetAttribute());
}
};
//-----------------------------------------------------------------------------
// Prevent CDmaArray for DmElementHandle_t
//-----------------------------------------------------------------------------
template <>
class CDmaArray<DmElementHandle_t> {
private:
CDmaArray();
};
template <class E>
class CDmrElementArray;
template <class E = CDmElement>
class CDmaElementArray
: public CDmaElementArrayBase<
E, CDmaDataInternal<CUtlVector<DmElementHandle_t> > > {
DECLARE_ATTRIBUTE_ARRAY_VARIABLE(CDmaElementArray, DmElementHandle_t);
public:
void Init(CDmElement *pOwner, const char *pAttributeName, int flags = 0) {
Assert(pOwner);
this->m_pAttribute = pOwner->AddExternalAttribute(
pAttributeName, AT_ELEMENT_ARRAY,
&CDmaElementArrayBase<
E, CDmaDataInternal<CUtlVector<DmElementHandle_t> > >::Value());
this->m_pAttribute->SetElementTypeSymbol(E::GetStaticTypeSymbol());
if (flags) {
this->m_pAttribute->AddFlag(flags);
}
}
template <typename C>
CDmaElementArray<E> &operator=(const C &val) {
CopyArray(val.Base(), val.Count());
return *this;
}
// NOTE: The copy operator= must be defined in addition to the generic one
const CDmaElementArray<E> &operator=(const CDmaElementArray<E> &val) {
CopyArray(val.Base(), val.Count());
return *this;
}
private:
template <class C>
CDmaElementArray(const CDmaElementArray<C> &var);
};
template <class E = CDmElement>
class CDmrElementArrayConst
: public CDmaElementArrayConstBase<
E, CDmaArrayConstBase<
DmElementHandle_t,
CDmaDataExternal<CUtlVector<DmElementHandle_t> > > > {
public:
CDmrElementArrayConst() { this->m_pAttribute = NULL; }
CDmrElementArrayConst(const CDmAttribute *pAttribute) { Init(pAttribute); }
CDmrElementArrayConst(const CDmElement *pElement,
const char *pAttributeName) {
Init(pElement, pAttributeName);
}
template <typename C>
CDmrElementArrayConst(const CDmaElementArray<C> &var) {
Init(var.GetAttribute());
}
template <typename C>
CDmrElementArrayConst(const CDmrElementArray<C> &var) {
Init(var.GetAttribute());
}
template <typename C>
CDmrElementArrayConst(const CDmrElementArrayConst<C> &var) {
Init(var.GetAttribute());
}
void Init(const CDmAttribute *pAttribute) {
if (pAttribute && pAttribute->GetType() == AT_ELEMENT_ARRAY) {
this->m_pAttribute = const_cast<CDmAttribute *>(pAttribute);
this->Attach(this->m_pAttribute->GetAttributeData());
} else {
this->m_pAttribute = NULL;
this->Attach(NULL);
}
}
void Init(const CDmElement *pElement, const char *pAttributeName) {
const CDmAttribute *pAttribute = NULL;
if (pElement && pAttributeName && pAttributeName[0]) {
pAttribute = (CDmAttribute *)pElement->GetAttribute(pAttributeName);
}
Init(pAttribute);
}
bool IsValid() const { return this->m_pAttribute != NULL; }
};
template <class T = CDmElement>
class CDmrElementArray
: public CDmaElementArrayBase<
T, CDmaDataExternal<CUtlVector<DmElementHandle_t> > > {
public:
CDmrElementArray() { this->m_pAttribute = NULL; }
CDmrElementArray(CDmAttribute *pAttribute) { Init(pAttribute); }
CDmrElementArray(CDmElement *pElement, const char *pAttributeName,
bool bAddAttribute = false) {
Init(pElement, pAttributeName, bAddAttribute);
}
template <typename C>
CDmrElementArray(CDmaElementArray<C> &var) {
Init(var.GetAttribute());
}
template <typename C>
CDmrElementArray(CDmrElementArray<C> &var) {
Init(var.GetAttribute());
}
void Init(CDmAttribute *pAttribute) {
if (pAttribute && pAttribute->GetType() == AT_ELEMENT_ARRAY) {
this->m_pAttribute = pAttribute;
this->Attach(this->m_pAttribute->GetAttributeData());
} else {
this->m_pAttribute = NULL;
this->Attach(NULL);
}
}
void Init(CDmElement *pElement, const char *pAttributeName,
bool bAddAttribute = false) {
CDmAttribute *pAttribute = NULL;
if (pElement && pAttributeName && pAttributeName[0]) {
pAttribute = pElement->GetAttribute(pAttributeName);
if (bAddAttribute && !pAttribute) {
pAttribute =
pElement->CreateAttribute(pAttributeName, AT_ELEMENT_ARRAY);
// FIXME: Should we do this?
pAttribute->SetElementTypeSymbol(T::GetStaticTypeSymbol());
}
}
Init(pAttribute);
}
bool IsValid() const { return this->m_pAttribute != NULL; }
template <typename C>
CDmrElementArray<T> &operator=(const C &val) {
CopyArray(val.Base(), val.Count());
return *this;
}
// NOTE: The copy operator= must be defined in addition to the generic one
const CDmrElementArray<T> &operator=(const CDmrElementArray<T> &val) {
CopyArray(val.Base(), val.Count());
return *this;
}
};
//-----------------------------------------------------------------------------
//
// Inline methods for CDmaVar
//
//-----------------------------------------------------------------------------
template <class T>
inline CDmaVar<T>::CDmaVar() {
m_pAttribute = NULL;
CDmAttributeInfo<T>::SetDefaultValue(m_Storage);
}
template <class T>
inline void CDmaVar<T>::Init(CDmElement *pOwner, const char *pAttributeName,
int flags) {
Assert(pOwner);
m_pAttribute = pOwner->AddExternalAttribute(
pAttributeName, CDmAttributeInfo<T>::AttributeType(), &m_Storage);
Assert(m_pAttribute);
if (flags) {
m_pAttribute->AddFlag(flags);
}
}
template <class T>
inline void CDmaVar<T>::InitAndSet(CDmElement *pOwner,
const char *pAttributeName, const T &value,
int flags) {
Init(pOwner, pAttributeName);
Set(value);
// this has to happen AFTER set so the set happens before FATTRIB_READONLY
if (flags) {
m_pAttribute->AddFlag(flags);
}
}
template <class T>
inline const T &CDmaVar<T>::Set(const T &val) {
Assert(m_pAttribute);
m_pAttribute->SetValue(val);
return m_Storage;
}
template <class T>
inline const T &CDmaVar<T>::operator=(const T &val) {
return Set(val);
}
template <class T>
inline const CDmaVar<T> &CDmaVar<T>::operator=(const CDmaVar<T> &src) {
Set(src.Get());
return *this;
}
template <class T>
inline const T &CDmaVar<T>::operator+=(const T &val) {
return Set(Value() + val);
}
template <class T>
inline const T &CDmaVar<T>::operator-=(const T &val) {
return Set(Value() - val);
}
template <class T>
inline const T &CDmaVar<T>::operator/=(const T &val) {
return Set(Value() / val);
}
template <class T>
inline const T &CDmaVar<T>::operator*=(const T &val) {
return Set(Value() * val);
}
template <class T>
inline const T &CDmaVar<T>::operator^=(const T &val) {
return Set(Value() ^ val);
}
template <class T>
inline const T &CDmaVar<T>::operator|=(const T &val) {
return Set(Value() | val);
}
template <class T>
inline const T &CDmaVar<T>::operator&=(const T &val) {
return Set(Value() & val);
}
template <class T>
inline T CDmaVar<T>::operator++() {
return Set(Value() + 1);
}
template <class T>
inline T CDmaVar<T>::operator--() {
return Set(Value() - 1);
}
template <class T>
inline T CDmaVar<T>::operator++(int) // postfix version..
{
T oldValue = Value();
Set(Value() + 1);
return oldValue;
}
template <class T>
inline T CDmaVar<T>::operator--(int) // postfix version..
{
T oldValue = Value();
Set(Value() - 1);
return oldValue;
}
template <class T>
inline CDmaVar<T>::operator const T &() const {
return Value();
}
template <class T>
inline const T &CDmaVar<T>::Get() const {
return Value();
}
template <class T>
inline const T *CDmaVar<T>::operator->() const {
return &Value();
}
template <class T>
inline CDmAttribute *CDmaVar<T>::GetAttribute() {
Assert(m_pAttribute);
return m_pAttribute;
}
template <class T>
inline const CDmAttribute *CDmaVar<T>::GetAttribute() const {
Assert(m_pAttribute);
return m_pAttribute;
}
template <class T>
inline bool CDmaVar<T>::IsDirty() const {
Assert(m_pAttribute);
return m_pAttribute->IsFlagSet(FATTRIB_DIRTY);
}
template <class T>
inline const T &CDmaVar<T>::Value() const {
return m_Storage;
}
template <class T>
inline T &CDmaVar<T>::Value() {
return m_Storage;
}
template <>
inline const DmElementHandle_t &CDmaVar<DmElementHandle_t>::Value() const {
return m_Storage.m_Handle;
}
template <>
inline DmElementHandle_t &CDmaVar<DmElementHandle_t>::Value() {
return m_Storage.m_Handle;
}
template <class T>
inline const typename CDmaVar<T>::D &CDmaVar<T>::Storage() const {
return m_Storage;
}
template <class T>
inline typename CDmaVar<T>::D &CDmaVar<T>::Storage() {
return m_Storage;
}
//-----------------------------------------------------------------------------
//
// Inline methods for CDmaColor
//
//-----------------------------------------------------------------------------
inline void CDmaColor::SetColor(int r, int g, int b, int a) {
Color clr(r, g, b, a);
m_pAttribute->SetValue(clr);
}
inline void CDmaColor::SetRed(int r) {
Color org = Value();
org[0] = r;
m_pAttribute->SetValue(org);
}
inline void CDmaColor::SetGreen(int g) {
Color org = Value();
org[1] = g;
m_pAttribute->SetValue(org);
}
inline void CDmaColor::SetBlue(int b) {
Color org = Value();
org[2] = b;
m_pAttribute->SetValue(org);
}
inline void CDmaColor::SetAlpha(int a) {
Color org = Value();
org[3] = a;
m_pAttribute->SetValue(org);
}
inline unsigned char CDmaColor::r() const { return (unsigned char)Value().r(); }
inline unsigned char CDmaColor::g() const { return (unsigned char)Value().g(); }
inline unsigned char CDmaColor::b() const { return (unsigned char)Value().b(); }
inline unsigned char CDmaColor::a() const { return (unsigned char)Value().a(); }
inline const unsigned char &CDmaColor::operator[](int index) const {
return Value()[index];
}
inline void CDmaColor::SetRawColor(int color) {
Color clr;
clr.SetRawColor(color);
m_pAttribute->SetValue(clr);
}
//-----------------------------------------------------------------------------
//
// Inline methods for CDmaObjectId
//
//-----------------------------------------------------------------------------
inline void CDmaObjectId::CreateObjectId() {
DmObjectId_t id;
CreateUniqueId(&id);
m_pAttribute->SetValue(id);
}
inline void CDmaObjectId::Invalidate() {
DmObjectId_t id;
InvalidateUniqueId(&id);
m_pAttribute->SetValue(id);
}
inline bool CDmaObjectId::IsValid() const { return IsUniqueIdValid(Value()); }
inline bool CDmaObjectId::IsEqual(const DmObjectId_t &id) const {
return IsUniqueIdEqual(Value(), id);
}
inline const DmObjectId_t &CDmaObjectId::operator=(const DmObjectId_t &src) {
m_pAttribute->SetValue(src);
return Value();
}
inline const CDmaObjectId &CDmaObjectId::operator=(const CDmaObjectId &src) {
m_pAttribute->SetValue(src.Get());
return *this;
}
inline const DmObjectId_t &CDmaObjectId::Set(const DmObjectId_t &src) {
m_pAttribute->SetValue(src);
return Value();
}
//-----------------------------------------------------------------------------
//
// Inline methods for CDmaString
//
//-----------------------------------------------------------------------------
inline const char *CDmaString::Get() const { return Value().Get(); }
inline CDmaString::operator const char *() const { return Value().Get(); }
inline void CDmaString::Set(const char *pValue) {
CUtlString str(pValue, pValue ? Q_strlen(pValue) + 1 : 0);
m_pAttribute->SetValue(str);
}
// Returns strlen
inline int CDmaString::Length() const { return Value().Length(); }
inline CDmaString &CDmaString::operator=(const char *src) {
Set(src);
return *this;
}
inline const CDmaString &CDmaString::operator=(const CDmaString &src) {
Set(src.Get());
return *this;
}
//-----------------------------------------------------------------------------
//
// Inline methods for CDmaBinaryBlock
//
//-----------------------------------------------------------------------------
inline void CDmaBinaryBlock::Get(void *pValue, int nMaxLen) const {
Value().Get(pValue, nMaxLen);
}
inline void CDmaBinaryBlock::Set(const void *pValue, int nLen) {
CUtlBinaryBlock block(pValue, nLen);
m_pAttribute->SetValue(block);
}
inline const void *CDmaBinaryBlock::Get() const { return Value().Get(); }
inline const unsigned char &CDmaBinaryBlock::operator[](int i) const {
return Value()[i];
}
inline int CDmaBinaryBlock::Length() const { return Value().Length(); }
//-----------------------------------------------------------------------------
//
// Inline methods for CDmaElement
//
//-----------------------------------------------------------------------------
template <class T>
inline void CDmaElement<T>::InitAndCreate(CDmElement *pOwner,
const char *pAttributeName,
const char *pElementName, int flags) {
Init(pOwner, pAttributeName);
DmElementHandle_t hElement = DMELEMENT_HANDLE_INVALID;
if (!g_pDataModel->IsUnserializing()) {
hElement = g_pDataModel->CreateElement(
T::GetStaticTypeSymbol(), pElementName, pOwner->GetFileId());
}
Assert(m_pAttribute);
m_pAttribute->SetValue(hElement);
// this has to happen AFTER set so the set happens before FATTRIB_READONLY
m_pAttribute->AddFlag(flags | FATTRIB_MUSTCOPY);
}
template <class T>
inline void CDmaElement<T>::Init(CDmElement *pOwner, const char *pAttributeName,
int flags) {
BaseClass::Init(pOwner, pAttributeName);
Assert(m_pAttribute);
m_pAttribute->SetElementTypeSymbol(T::GetStaticTypeSymbol());
if (flags) {
m_pAttribute->AddFlag(flags);
}
}
template <class T>
inline UtlSymId_t CDmaElement<T>::GetElementType() const {
return this->Data().m_ElementType;
}
template <class T>
inline T *CDmaElement<T>::GetElement() const {
CDmElement *pElement = g_pDataModel->GetElement(Value());
Assert(!pElement || pElement->IsA(T::GetStaticTypeSymbol()));
return static_cast<T *>(pElement);
}
template <class T>
inline T *CDmaElement<T>::operator->() const {
return GetElement();
}
template <class T>
inline CDmaElement<T>::operator T *() const {
return GetElement();
}
template <class T>
inline void CDmaElement<T>::Set(T *pElement) {
Assert(m_pAttribute);
m_pAttribute->SetValue(pElement ? pElement->GetHandle()
: DMELEMENT_HANDLE_INVALID);
}
template <class T>
inline bool CDmaElement<T>::operator!() const {
return (GetElement() == NULL);
}
//-----------------------------------------------------------------------------
//
// Inline methods for CDmaArrayBase
//
//-----------------------------------------------------------------------------
template <class T, class B>
inline const CUtlVector<T> &CDmaArrayConstBase<T, B>::Get() const {
return this->Value();
}
template <class T, class B>
inline const T *CDmaArrayConstBase<T, B>::Base() const {
return this->Value().Base();
}
template <class T, class B>
inline const T &CDmaArrayConstBase<T, B>::operator[](int i) const {
return this->Value()[i];
}
template <class T, class B>
const T &CDmaArrayConstBase<T, B>::Element(int i) const {
return this->Value()[i];
}
template <class T, class B>
inline const T &CDmaArrayConstBase<T, B>::Get(int i) const {
return this->Value()[i];
}
template <class T, class B>
const void *CDmaArrayConstBase<T, B>::GetUntyped(int i) const {
return &(this->Value()[i]);
}
template <class T, class B>
inline int CDmaArrayConstBase<T, B>::Count() const {
return this->Value().Count();
}
template <class T, class B>
inline bool CDmaArrayConstBase<T, B>::IsValidIndex(int i) const {
return this->Value().IsValidIndex(i);
}
template <class T, class B>
inline int CDmaArrayConstBase<T, B>::InvalidIndex(void) const {
return this->Value().InvalidIndex();
}
template <class T, class B>
inline const CDmAttribute *CDmaArrayConstBase<T, B>::GetAttribute() const {
Assert(m_pAttribute);
return m_pAttribute;
}
template <class T, class B>
inline CDmElement *CDmaArrayConstBase<T, B>::GetOwner() {
return m_pAttribute->GetOwner();
}
template <class T, class B>
inline bool CDmaArrayConstBase<T, B>::IsDirty() const {
return m_pAttribute->IsFlagSet(FATTRIB_DIRTY);
}
template <class T, class B>
inline CDmAttribute *CDmaArrayBase<T, B>::GetAttribute() {
Assert(this->m_pAttribute);
return this->m_pAttribute;
}
template <class T, class B>
inline const CDmAttribute *CDmaArrayBase<T, B>::GetAttribute() const {
Assert(this->m_pAttribute);
return this->m_pAttribute;
}
//-----------------------------------------------------------------------------
//
// Inline methods for CDmaStringArrayBase
//
//-----------------------------------------------------------------------------
template <class B>
inline const char *CDmaStringArrayConstBase<B>::operator[](int i) const {
return this->Value()[i].Get();
}
template <class B>
inline const char *CDmaStringArrayConstBase<B>::Element(int i) const {
return this->Value()[i].Get();
}
template <class B>
inline const char *CDmaStringArrayConstBase<B>::Get(int i) const {
return this->Value()[i].Get();
}
template <class B>
inline const CUtlVector<CUtlString> &CDmaStringArrayConstBase<B>::Get() const {
return this->Value();
}
// Returns strlen of element i
template <class B>
inline int CDmaStringArrayConstBase<B>::Length(int i) const {
return this->Value()[i].Length();
}
template <class B>
inline void CDmaStringArrayBase<B>::Set(int i, const char *pValue) {
CUtlString str(pValue, Q_strlen(pValue) + 1);
BaseClass::Set(i, str);
}
// Adds an element, uses copy constructor
template <class B>
inline int CDmaStringArrayBase<B>::AddToTail(const char *pValue) {
CUtlString str(pValue, Q_strlen(pValue) + 1);
return BaseClass::AddToTail(str);
}
template <class B>
inline int CDmaStringArrayBase<B>::InsertBefore(int elem, const char *pValue) {
CUtlString str(pValue, Q_strlen(pValue) + 1);
return BaseClass::InsertBefore(elem, str);
}
//-----------------------------------------------------------------------------
//
// Inline methods for CDmaElementArrayBase
//
//-----------------------------------------------------------------------------
template <class E, class B>
inline UtlSymId_t CDmaElementArrayConstBase<E, B>::GetElementType() const {
return this->Data().m_ElementType;
}
template <class E, class B>
inline E *CDmaElementArrayConstBase<E, B>::operator[](int i) const {
return GetElement<E>(this->Value()[i]);
}
template <class E, class B>
inline E *CDmaElementArrayConstBase<E, B>::Element(int i) const {
return GetElement<E>(this->Value()[i]);
}
template <class E, class B>
inline E *CDmaElementArrayConstBase<E, B>::Get(int i) const {
return GetElement<E>(this->Value()[i]);
}
template <class E, class B>
inline const DmElementHandle_t &CDmaElementArrayConstBase<E, B>::GetHandle(
int i) const {
return this->Value()[i];
}
template <class E, class B>
inline const CUtlVector<DmElementHandle_t>
&CDmaElementArrayConstBase<E, B>::Get() const {
return this->Value();
}
// Search
template <class E, class B>
inline int CDmaElementArrayConstBase<E, B>::Find(const E *pValue) const {
if (!pValue) return -1;
return B::Find(pValue->GetHandle());
}
template <class E, class B>
inline int CDmaElementArrayConstBase<E, B>::Find(DmElementHandle_t h) const {
return B::Find(h);
}
template <class E, class B>
inline void CDmaElementArrayBase<E, B>::SetHandle(int i, DmElementHandle_t h) {
BaseClass::Set(i, h);
}
template <class E, class B>
inline void CDmaElementArrayBase<E, B>::Set(int i, E *pElement) {
BaseClass::Set(i,
pElement ? pElement->GetHandle() : DMELEMENT_HANDLE_INVALID);
}
// Adds an element, uses copy constructor
template <class E, class B>
inline int CDmaElementArrayBase<E, B>::AddToTail() {
return BaseClass::AddToTail();
}
template <class E, class B>
inline int CDmaElementArrayBase<E, B>::AddToTail(E *pValue) {
return BaseClass::AddToTail(pValue ? pValue->GetHandle()
: DMELEMENT_HANDLE_INVALID);
}
template <class E, class B>
inline int CDmaElementArrayBase<E, B>::AddToTail(DmElementHandle_t src) {
return BaseClass::AddToTail(src);
}
template <class E, class B>
inline int CDmaElementArrayBase<E, B>::InsertBefore(int elem) {
return BaseClass::InsertBefore(elem);
}
template <class E, class B>
inline int CDmaElementArrayBase<E, B>::InsertBefore(int elem, E *pValue) {
return BaseClass::InsertBefore(
elem, pValue ? pValue->GetHandle() : DMELEMENT_HANDLE_INVALID);
}
template <class E, class B>
inline int CDmaElementArrayBase<E, B>::InsertBefore(int elem,
DmElementHandle_t src) {
return BaseClass::InsertBefore(elem, src);
}
//-----------------------------------------------------------------------------
//
// Inline methods for CDmrGenericArray
//
//-----------------------------------------------------------------------------
inline const CDmAttribute *CDmrGenericArrayConst::GetAttribute() const {
Assert(m_pAttribute);
return m_pAttribute;
}
inline bool CDmrGenericArrayConst::IsValid() const {
return m_pAttribute != NULL;
}
inline CDmAttribute *CDmrGenericArray::GetAttribute() {
Assert(m_pAttribute);
return m_pAttribute;
}
inline const CDmAttribute *CDmrGenericArray::GetAttribute() const {
Assert(m_pAttribute);
return m_pAttribute;
}
#endif // DMATTRIBUTEVAR_H