skia2/src/core/SkVarAlloc.h
mtklein 5a744b7801 Have SkVarAlloc::alloc() use sk_malloc_throw.
Very right, it's not prepared to handle return-NULL mallocs at all.

BUG=530759

Review URL: https://codereview.chromium.org/1339093002
2015-09-14 11:11:17 -07:00

56 lines
1.3 KiB
C++

/*
* Copyright 2015 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkVarAlloc_DEFINED
#define SkVarAlloc_DEFINED
#include "SkTypes.h"
class SkVarAlloc : SkNoncopyable {
public:
// Smallest block we'll allocate is 2**N bytes.
explicit SkVarAlloc(size_t minLgSize);
// Same as above, but first uses up to len bytes from storage.
SkVarAlloc(size_t minLgSize, char* storage, size_t len);
~SkVarAlloc();
// Returns contiguous bytes aligned at least for pointers.
char* alloc(size_t bytes) {
bytes = SkAlignPtr(bytes);
if (bytes > fRemaining) {
this->makeSpace(bytes);
}
SkASSERT(bytes <= fRemaining);
char* ptr = fByte;
fByte += bytes;
fRemaining = SkToU32(fRemaining - bytes);
return ptr;
}
// Returns our best estimate of the number of bytes we've allocated.
// (We may not track this precisely to save space.)
size_t approxBytesAllocated() const { return fBytesAllocated; }
private:
void makeSpace(size_t bytes);
size_t fBytesAllocated;
char* fByte;
unsigned fRemaining;
unsigned fLgSize;
struct Block;
Block* fBlock;
};
static_assert(sizeof(SkVarAlloc) <= 32, "SkVarAllocSize");
#endif//SkVarAlloc_DEFINED