Skip to content

Commit 3293ab2

Browse files
IDataBlob: added Offset parameter to GetDataPtr and GetConstDataPtr methods
1 parent cb699ef commit 3293ab2

File tree

6 files changed

+36
-32
lines changed

6 files changed

+36
-32
lines changed

Common/interface/DataBlobImpl.hpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -60,21 +60,21 @@ class DataBlobImpl final : public Diligent::ObjectBase<IDataBlob>
6060
virtual size_t DILIGENT_CALL_TYPE GetSize() const override;
6161

6262
/// Returns the pointer to the internal data buffer
63-
virtual void* DILIGENT_CALL_TYPE GetDataPtr() override;
63+
virtual void* DILIGENT_CALL_TYPE GetDataPtr(size_t Offset = 0) override;
6464

6565
/// Returns const pointer to the internal data buffer
66-
virtual const void* DILIGENT_CALL_TYPE GetConstDataPtr() const override;
66+
virtual const void* DILIGENT_CALL_TYPE GetConstDataPtr(size_t Offset = 0) const override;
6767

6868
template <typename T>
69-
T* GetDataPtr()
69+
T* GetDataPtr(size_t Offset = 0)
7070
{
71-
return reinterpret_cast<T*>(GetDataPtr());
71+
return reinterpret_cast<T*>(GetDataPtr(Offset));
7272
}
7373

7474
template <typename T>
75-
const T* GetConstDataPtr() const
75+
const T* GetConstDataPtr(size_t Offset = 0) const
7676
{
77-
return reinterpret_cast<const T*>(GetConstDataPtr());
77+
return reinterpret_cast<const T*>(GetConstDataPtr(Offset));
7878
}
7979

8080
private:

Common/interface/ProxyDataBlob.hpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -78,15 +78,17 @@ class ProxyDataBlob : public ObjectBase<IDataBlob>
7878
}
7979

8080
/// Returns the pointer to the internal data buffer
81-
virtual void* DILIGENT_CALL_TYPE GetDataPtr() override
81+
virtual void* DILIGENT_CALL_TYPE GetDataPtr(size_t Offset = 0) override
8282
{
83-
return m_pData;
83+
VERIFY(Offset < m_Size, "Offset (", Offset, ") exceeds the data size (", m_Size, ")");
84+
return static_cast<Uint8*>(m_pData) + Offset;
8485
}
8586

8687
/// Returns the pointer to the internal data buffer
87-
virtual const void* DILIGENT_CALL_TYPE GetConstDataPtr() const override
88+
virtual const void* DILIGENT_CALL_TYPE GetConstDataPtr(size_t Offset = 0) const override
8889
{
89-
return m_pConstData;
90+
VERIFY(Offset < m_Size, "Offset (", Offset, ") exceeds the data size (", m_Size, ")");
91+
return static_cast<const Uint8*>(m_pConstData) + Offset;
9092
}
9193

9294
private:

Common/interface/StringDataBlobImpl.hpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -73,15 +73,15 @@ class StringDataBlobImpl : public ObjectBase<IDataBlob>
7373
}
7474

7575
/// Returns the pointer to the internal data buffer
76-
virtual void* DILIGENT_CALL_TYPE GetDataPtr() override
76+
virtual void* DILIGENT_CALL_TYPE GetDataPtr(size_t Offset = 0) override
7777
{
78-
return &m_String[0];
78+
return &m_String[Offset];
7979
}
8080

8181
/// Returns the pointer to the internal data buffer
82-
virtual const void* DILIGENT_CALL_TYPE GetConstDataPtr() const override
82+
virtual const void* DILIGENT_CALL_TYPE GetConstDataPtr(size_t Offset = 0) const override
8383
{
84-
return &m_String[0];
84+
return &m_String[Offset];
8585
}
8686

8787
private:

Common/src/DataBlobImpl.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -72,15 +72,15 @@ size_t DataBlobImpl::GetSize() const
7272
}
7373

7474
/// Returns the pointer to the internal data buffer
75-
void* DataBlobImpl::GetDataPtr()
75+
void* DataBlobImpl::GetDataPtr(size_t Offset)
7676
{
77-
return m_DataBuff.data();
77+
return &m_DataBuff[Offset];
7878
}
7979

8080
/// Returns const pointer to the internal data buffer
81-
const void* DataBlobImpl::GetConstDataPtr() const
81+
const void* DataBlobImpl::GetConstDataPtr(size_t Offset) const
8282
{
83-
return m_DataBuff.data();
83+
return &m_DataBuff[Offset];
8484
}
8585

8686
IMPLEMENT_QUERY_INTERFACE(DataBlobImpl, IID_DataBlob, TBase)

Common/src/MemoryFileStream.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2019-2022 Diligent Graphics LLC
2+
* Copyright 2019-2024 Diligent Graphics LLC
33
* Copyright 2015-2019 Egor Yusov
44
*
55
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -50,19 +50,19 @@ IMPLEMENT_QUERY_INTERFACE(MemoryFileStream, IID_FileStream, TBase)
5050
bool MemoryFileStream::Read(void* Data, size_t Size)
5151
{
5252
VERIFY_EXPR(m_CurrentOffset <= m_DataBlob->GetSize());
53-
auto BytesLeft = m_DataBlob->GetSize() - m_CurrentOffset;
54-
auto BytesToRead = std::min(BytesLeft, Size);
55-
auto* pSrcData = reinterpret_cast<const Uint8*>(m_DataBlob->GetDataPtr()) + m_CurrentOffset;
53+
size_t BytesLeft = m_DataBlob->GetSize() - m_CurrentOffset;
54+
size_t BytesToRead = std::min(BytesLeft, Size);
55+
const void* pSrcData = m_DataBlob->GetConstDataPtr(m_CurrentOffset);
5656
memcpy(Data, pSrcData, BytesToRead);
5757
m_CurrentOffset += BytesToRead;
5858
return Size == BytesToRead;
5959
}
6060

6161
void MemoryFileStream::ReadBlob(IDataBlob* pData)
6262
{
63-
auto BytesLeft = m_DataBlob->GetSize() - m_CurrentOffset;
63+
size_t BytesLeft = m_DataBlob->GetSize() - m_CurrentOffset;
6464
pData->Resize(BytesLeft);
65-
auto res = Read(pData->GetDataPtr(), pData->GetSize());
65+
bool res = Read(pData->GetDataPtr(), pData->GetSize());
6666
VERIFY_EXPR(res);
6767
(void)res;
6868
}
@@ -73,7 +73,7 @@ bool MemoryFileStream::Write(const void* Data, size_t Size)
7373
{
7474
m_DataBlob->Resize(m_CurrentOffset + Size);
7575
}
76-
auto* DstData = reinterpret_cast<Uint8*>(m_DataBlob->GetDataPtr()) + m_CurrentOffset;
76+
void* DstData = m_DataBlob->GetDataPtr(m_CurrentOffset);
7777
memcpy(DstData, Data, Size);
7878
m_CurrentOffset += Size;
7979
return true;

Primitives/interface/DataBlob.h

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2019-2023 Diligent Graphics LLC
2+
* Copyright 2019-2024 Diligent Graphics LLC
33
* Copyright 2015-2019 Egor Yusov
44
*
55
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -59,10 +59,12 @@ DILIGENT_BEGIN_INTERFACE(IDataBlob, IObject)
5959
VIRTUAL size_t METHOD(GetSize)(THIS) CONST PURE;
6060

6161
/// Returns the pointer to the internal data buffer
62-
VIRTUAL void* METHOD(GetDataPtr)(THIS) PURE;
62+
VIRTUAL void* METHOD(GetDataPtr)(THIS_
63+
size_t Offset DEFAULT_VALUE(0)) PURE;
6364

6465
/// Returns const pointer to the internal data buffer
65-
VIRTUAL const void* METHOD(GetConstDataPtr)(THIS) CONST PURE;
66+
VIRTUAL const void* METHOD(GetConstDataPtr)(THIS_
67+
size_t Offset DEFAULT_VALUE(0)) CONST PURE;
6668
};
6769
DILIGENT_END_INTERFACE
6870

@@ -72,10 +74,10 @@ DILIGENT_END_INTERFACE
7274

7375
// clang-format off
7476

75-
# define IDataBlob_Resize(This, ...) CALL_IFACE_METHOD(DataBlob, Resize, This, __VA_ARGS__)
76-
# define IDataBlob_GetSize(This) CALL_IFACE_METHOD(DataBlob, GetSize, This)
77-
# define IDataBlob_GetDataPtr(This) CALL_IFACE_METHOD(DataBlob, GetDataPtr, This)
78-
# define IDataBlob_GetConstDataPtr(This) CALL_IFACE_METHOD(DataBlob, GetConstDataPtr, This)
77+
# define IDataBlob_Resize(This, ...) CALL_IFACE_METHOD(DataBlob, Resize, This, __VA_ARGS__)
78+
# define IDataBlob_GetSize(This) CALL_IFACE_METHOD(DataBlob, GetSize, This)
79+
# define IDataBlob_GetDataPtr(This, ...) CALL_IFACE_METHOD(DataBlob, GetDataPtr, This, __VA_ARGS__)
80+
# define IDataBlob_GetConstDataPtr(This, ...) CALL_IFACE_METHOD(DataBlob, GetConstDataPtr, This, __VA_ARGS__)
7981

8082
// clang-format on
8183

0 commit comments

Comments
 (0)