summaryrefslogtreecommitdiff
path: root/src/md/heaps/guidheap.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/md/heaps/guidheap.h')
-rw-r--r--src/md/heaps/guidheap.h259
1 files changed, 259 insertions, 0 deletions
diff --git a/src/md/heaps/guidheap.h b/src/md/heaps/guidheap.h
new file mode 100644
index 0000000000..57f0147871
--- /dev/null
+++ b/src/md/heaps/guidheap.h
@@ -0,0 +1,259 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+//
+// File: GuidHeap.h
+//
+
+//
+// Classes code:MetaData::GuidHeapRO and code:MetaData::GuidHeapRW represent #GUID heap.
+// The #GUID heap stores size-prefixed data chunks (as defined in CLI ECMA specification). Elements are
+// indexed by code:#GuidHeapIndex.
+//
+//#GuidHeapIndex
+// Guid heap indexes are 1-based and they are really indexes, not offsets (as in string heap).
+// The indexes correspond to:
+// * 0 ... invalid index,
+// * 1 ... data offset 0,
+// * 2 ... data offset sizeof(GUID),
+// * n ... data offset (n-1)*sizeof(GUID).
+// Note that this class provides only translation from 1-based index to 0-based index. The translation of
+// 0-based index to data offset is done in code:GuidHeapStorage::GetGuid.
+//
+// ======================================================================================
+
+#pragma once
+
+#include "external.h"
+
+namespace MetaData
+{
+
+// --------------------------------------------------------------------------------------
+//
+// This class represents read-only #GUID heap with all utility methods.
+//
+class GuidHeapRO
+{
+ friend class GuidHeapRW;
+
+private:
+ //
+ // Private data
+ //
+
+ // The storage of guids.
+ StgPoolReadOnly m_GuidPool;
+
+public:
+ //
+ // Initialization
+ //
+
+ __checkReturn
+ inline HRESULT Initialize(
+ DataBlob sourceData,
+ BOOL fCopyData)
+ {
+ _ASSERTE(!fCopyData);
+ return m_GuidPool.InitOnMemReadOnly((void *)sourceData.GetDataPointer(), sourceData.GetSize());
+ }
+
+#ifdef FEATURE_PREJIT
+ // Can be called multiple times.
+ inline void InitializeHotData(
+ HotHeap hotHeap)
+ {
+ m_GuidPool.InitHotData(hotHeap);
+ }
+#endif //FEATURE_PREJIT
+
+ // Destroys the guid heap and all its allocated data. Can run on uninitialized guid heap.
+ inline void Delete()
+ {
+ return m_GuidPool.Uninit();
+ }
+
+public:
+ //
+ // Getters
+ //
+
+ // Gets pointer to guid (*ppGuid) at index (nIndex, see code:#GuidHeapIndex).
+ // Returns error code for invalid index (0, or too large index) and sets *ppGuid to NULL.
+ __checkReturn
+ inline HRESULT GetGuid(
+ UINT32 nIndex,
+ __deref_out GUID UNALIGNED **ppGuid)
+ {
+ return m_GuidPool.GetGuid(nIndex, ppGuid);
+ }
+ __checkReturn
+ inline HRESULT GetGuid(
+ UINT32 nIndex,
+ __deref_out const GUID UNALIGNED **ppGuid) const
+ {
+ return const_cast<StgPoolReadOnly &>(m_GuidPool).GetGuid(nIndex, const_cast<GUID UNALIGNED **>(ppGuid));
+ }
+
+ inline UINT32 GetSize() const
+ {
+ return const_cast<StgPoolReadOnly &>(m_GuidPool).GetPoolSize();
+ }
+
+}; // class GuidHeapRO
+
+// --------------------------------------------------------------------------------------
+//
+// This class represents read-write #GUID heap with all utility methods.
+//
+class GuidHeapRW
+{
+private:
+ //
+ // Private data
+ //
+
+ // The storage of guids.
+ StgGuidPool m_GuidPool;
+
+public:
+ //
+ // Initialization
+ //
+
+ __checkReturn
+ inline HRESULT InitializeEmpty(
+ UINT32 cbAllocationSize
+ COMMA_INDEBUG_MD(BOOL debug_fIsReadWrite))
+ {
+ return m_GuidPool.InitNew(cbAllocationSize, 0);
+ }
+ __checkReturn
+ inline HRESULT InitializeEmpty_WithItemsCount(
+ UINT32 cbAllocationSize,
+ UINT32 cItemsCount
+ COMMA_INDEBUG_MD(BOOL debug_fIsReadWrite))
+ {
+ return m_GuidPool.InitNew(cbAllocationSize, cItemsCount);
+ }
+ __checkReturn
+ inline HRESULT Initialize(
+ DataBlob sourceData,
+ BOOL fCopyData)
+ {
+ return m_GuidPool.InitOnMem((void *)sourceData.GetDataPointer(), sourceData.GetSize(), !fCopyData);
+ }
+
+ __checkReturn
+ inline HRESULT InitializeFromGuidHeap(
+ const GuidHeapRO *pSourceGuidHeap,
+ BOOL fCopyData)
+ {
+ return m_GuidPool.InitOnMem(
+ (void *)pSourceGuidHeap->m_GuidPool.GetSegData(),
+ pSourceGuidHeap->m_GuidPool.GetDataSize(),
+ !fCopyData);
+ }
+ __checkReturn
+ inline HRESULT InitializeFromGuidHeap(
+ const GuidHeapRW *pSourceGuidHeap,
+ BOOL fCopyData)
+ {
+ return m_GuidPool.InitOnMem(
+ (void *)pSourceGuidHeap->m_GuidPool.GetSegData(),
+ pSourceGuidHeap->m_GuidPool.GetDataSize(),
+ !fCopyData);
+ }
+
+ // Destroys the guid heap and all its allocated data. Can run on uninitialized guid heap.
+ inline void Delete()
+ {
+ return m_GuidPool.Uninit();
+ }
+
+public:
+ //
+ // Getters
+ //
+
+ __checkReturn
+ inline HRESULT GetGuid(
+ UINT32 nIndex,
+ __deref_out GUID UNALIGNED **ppGuid)
+ {
+ return m_GuidPool.GetGuid(nIndex, ppGuid);
+ }
+ __checkReturn
+ inline HRESULT GetGuid(
+ UINT32 nIndex,
+ __deref_out const GUID UNALIGNED **ppGuid) const
+ {
+ return const_cast<StgGuidPool &>(m_GuidPool).GetGuid(nIndex, const_cast<GUID UNALIGNED **>(ppGuid));
+ }
+
+ // Gets size (in bytes) of the represented guid data. Note: the size is everytime aligned.
+ inline UINT32 GetSize() const
+ {
+ _ASSERTE(m_GuidPool.GetRawSize() % sizeof(GUID) == 0);
+ return m_GuidPool.GetRawSize();
+ }
+
+ // Returns TRUE if the guid heap is empty.
+ inline BOOL IsEmpty() const
+ {
+ return const_cast<StgGuidPool &>(m_GuidPool).IsEmpty();
+ }
+
+ // Returns TRUE if the guid index (nIndex, see code:#GuidHeapIndex) is valid (i.e. is in the guid
+ // heap).
+ // Note: index 0 is considered invalid.
+ inline BOOL IsValidIndex(UINT32 nIndex) const
+ {
+ return const_cast<StgGuidPool &>(m_GuidPool).IsValidCookie(nIndex);
+ }
+
+ __checkReturn
+ inline HRESULT SaveToStream(
+ __in IStream *pStream) const
+ {
+ return const_cast<StgGuidPool &>(m_GuidPool).PersistToStream(pStream);
+ }
+
+public:
+ //
+ // Heap modifications
+ //
+
+ // Adds guid (*pGuid) to the end of the heap.
+ // Returns S_OK and index (*pnIndex, see code:#GuidHeapIndex) of added GUID.
+ // Returns error code otherwise (and fills *pnIndex with 0 - an invalid GUID index).
+ __checkReturn
+ inline HRESULT AddGuid(
+ __in const GUID *pGuid,
+ __out UINT32 *pnIndex)
+ {
+ return m_GuidPool.AddGuid(pGuid, pnIndex);
+ }
+
+ // Adds data from *pSourceGuidHeap starting at index (nStartSourceIndex) to the guid heap.
+ // Returns S_OK (even if the source is empty) or error code.
+ __checkReturn
+ HRESULT AddGuidHeap(
+ const GuidHeapRW *pSourceGuidHeap,
+ UINT32 nStartSourceIndex)
+ {
+ return m_GuidPool.CopyPool(
+ nStartSourceIndex,
+ &pSourceGuidHeap->m_GuidPool);
+ } // GuidHeapRW::AddGuidHeap
+
+ __checkReturn
+ inline HRESULT MakeWritable()
+ {
+ return m_GuidPool.ConvertToRW();
+ }
+
+}; // class GuidHeapRW
+
+}; // namespace MetaData