Use safe way to get at a vector's data pointer
&std::vector<C>[0] is not guaranteed to not throw if the vector is empty. Better safe than sorry.
This commit is contained in:
parent
1b7ed5ed78
commit
520162f36a
|
@ -101,7 +101,7 @@ int RWMemGetData(SDL_RWops *ops, void *buffer)
|
|||
ByteVec *v = getRWPrivate(ops);
|
||||
|
||||
if (buffer)
|
||||
memcpy(buffer, &(*v)[0], v->size());
|
||||
memcpy(buffer, dataPtr(*v), v->size());
|
||||
|
||||
return v->size();
|
||||
}
|
||||
|
|
|
@ -67,7 +67,7 @@ struct GlobalIBO
|
|||
}
|
||||
|
||||
IBO::bind(ibo);
|
||||
IBO::uploadData(buffer.size() * sizeof(index_t), &buffer[0]);
|
||||
IBO::uploadData(buffer.size() * sizeof(index_t), dataPtr(buffer));
|
||||
IBO::unbind();
|
||||
}
|
||||
};
|
||||
|
|
|
@ -86,7 +86,7 @@ struct QuadArray
|
|||
{
|
||||
/* New data exceeds already allocated size.
|
||||
* Reallocate VBO. */
|
||||
VBO::uploadData(size, &vertices[0], GL_DYNAMIC_DRAW);
|
||||
VBO::uploadData(size, dataPtr(vertices), GL_DYNAMIC_DRAW);
|
||||
vboSize = size;
|
||||
|
||||
shState->ensureQuadIBO(quadCount);
|
||||
|
@ -94,7 +94,7 @@ struct QuadArray
|
|||
else
|
||||
{
|
||||
/* New data fits in allocated size */
|
||||
VBO::uploadSubData(0, size, &vertices[0]);
|
||||
VBO::uploadSubData(0, size, dataPtr(vertices));
|
||||
}
|
||||
|
||||
VBO::unbind();
|
||||
|
|
|
@ -265,7 +265,7 @@ createShadowSet()
|
|||
|
||||
/* Fill rects with half opacity black */
|
||||
uint32_t color = (0x80808080 & am);
|
||||
SDL_FillRects(surf, &rects[0], rects.size(), color);
|
||||
SDL_FillRects(surf, dataPtr(rects), rects.size(), color);
|
||||
|
||||
return surf;
|
||||
}
|
||||
|
|
|
@ -766,7 +766,7 @@ struct TilemapPrivate
|
|||
VBO::bind(tiles.vbo);
|
||||
VBO::allocEmpty(quadDataSize(quadCount));
|
||||
|
||||
VBO::uploadSubData(0, quadDataSize(groundQuadCount), &groundVert[0]);
|
||||
VBO::uploadSubData(0, quadDataSize(groundQuadCount), dataPtr(groundVert));
|
||||
|
||||
for (size_t i = 0; i < zlayersMax; ++i)
|
||||
{
|
||||
|
@ -774,7 +774,7 @@ struct TilemapPrivate
|
|||
continue;
|
||||
|
||||
VBO::uploadSubData(quadDataSize(zlayerBases[i]),
|
||||
quadDataSize(zlayerSize(i)), &zlayerVert[i][0]);
|
||||
quadDataSize(zlayerSize(i)), dataPtr(zlayerVert[i]));
|
||||
}
|
||||
|
||||
VBO::unbind();
|
||||
|
@ -855,7 +855,7 @@ struct TilemapPrivate
|
|||
return;
|
||||
|
||||
VBO::bind(flash.vbo);
|
||||
VBO::uploadData(sizeof(CVertex) * vertices.size(), &vertices[0]);
|
||||
VBO::uploadData(sizeof(CVertex) * vertices.size(), dataPtr(vertices));
|
||||
VBO::unbind();
|
||||
|
||||
/* Ensure global IBO size */
|
||||
|
|
|
@ -236,8 +236,8 @@ struct TilemapVXPrivate : public ViewportElement, TileAtlasVX::Reader
|
|||
allocQuads = totalQuads;
|
||||
}
|
||||
|
||||
VBO::uploadSubData(0, quadBytes(groundQuads), &groundVert[0]);
|
||||
VBO::uploadSubData(quadBytes(groundQuads), quadBytes(aboveQuads), &aboveVert[0]);
|
||||
VBO::uploadSubData(0, quadBytes(groundQuads), dataPtr(groundVert));
|
||||
VBO::uploadSubData(quadBytes(groundQuads), quadBytes(aboveQuads), dataPtr(aboveVert));
|
||||
|
||||
VBO::unbind();
|
||||
|
||||
|
|
13
src/util.h
13
src/util.h
|
@ -25,6 +25,7 @@
|
|||
#include <stdio.h>
|
||||
#include <string>
|
||||
#include <algorithm>
|
||||
#include <vector>
|
||||
|
||||
static inline int
|
||||
wrapRange(int value, int min, int max)
|
||||
|
@ -101,6 +102,18 @@ inline bool contains(const C &c, const V &v)
|
|||
return std::find(c.begin(), c.end(), v) != c.end();
|
||||
}
|
||||
|
||||
template<typename C>
|
||||
inline const C *dataPtr(const std::vector<C> &v)
|
||||
{
|
||||
return v.empty() ? (C*)0 : &v[0];
|
||||
}
|
||||
|
||||
template<typename C>
|
||||
inline C *dataPtr(std::vector<C> &v)
|
||||
{
|
||||
return v.empty() ? (C*)0 : &v[0];
|
||||
}
|
||||
|
||||
#define ARRAY_SIZE(obj) (sizeof(obj) / sizeof((obj)[0]))
|
||||
|
||||
#define elementsN(obj) const size_t obj##N = ARRAY_SIZE(obj)
|
||||
|
|
|
@ -374,7 +374,7 @@ struct WindowVXPrivate
|
|||
|
||||
base.vert.resize(count);
|
||||
|
||||
Vertex *vert = &base.vert.vertices[0];
|
||||
Vertex *vert = dataPtr(base.vert.vertices);
|
||||
size_t i = 0;
|
||||
|
||||
/* Stretched background */
|
||||
|
@ -518,7 +518,7 @@ struct WindowVXPrivate
|
|||
};
|
||||
|
||||
size_t i = 0;
|
||||
Vertex *vert = &ctrlVert.vertices[0];
|
||||
Vertex *vert = dataPtr(ctrlVert.vertices);
|
||||
|
||||
if (!nullOrDisposed(contents) && arrowsVisible)
|
||||
{
|
||||
|
@ -600,7 +600,7 @@ struct WindowVXPrivate
|
|||
quads += 1;
|
||||
|
||||
cursorVert.resize(quads);
|
||||
Vertex *vert = &cursorVert.vertices[0];
|
||||
Vertex *vert = dataPtr(cursorVert.vertices);
|
||||
size_t i = 0;
|
||||
|
||||
i += Quad::setTexPosRect(&vert[i*4], src.corners.tl, cornerPos.tl);
|
||||
|
|
Loading…
Reference in New Issue