Home | History | Annotate | Download | only in core
      1 /*
      2  * Copyright 2015 Google Inc.
      3  *
      4  * Use of this source code is governed by a BSD-style license that can be
      5  * found in the LICENSE file.
      6  */
      7 
      8 #ifndef SkVarAlloc_DEFINED
      9 #define SkVarAlloc_DEFINED
     10 
     11 #include "SkTypes.h"
     12 
     13 class SkVarAlloc : SkNoncopyable {
     14 public:
     15     // Smallest block we'll allocate is 2**N bytes.
     16     explicit SkVarAlloc(size_t minLgSize);
     17     // Same as above, but first uses up to len bytes from storage.
     18     SkVarAlloc(size_t minLgSize, char* storage, size_t len);
     19 
     20     ~SkVarAlloc();
     21 
     22     // Returns contiguous bytes aligned at least for pointers.  You may pass SK_MALLOC_THROW, etc.
     23     char* alloc(size_t bytes, unsigned sk_malloc_flags) {
     24         bytes = SkAlignPtr(bytes);
     25 
     26         if (bytes > fRemaining) {
     27             this->makeSpace(bytes, sk_malloc_flags);
     28         }
     29         SkASSERT(bytes <= fRemaining);
     30 
     31         char* ptr = fByte;
     32         fByte += bytes;
     33         fRemaining = SkToU32(fRemaining - bytes);
     34         return ptr;
     35     }
     36 
     37     // Returns our best estimate of the number of bytes we've allocated.
     38     // (We may not track this precisely to save space.)
     39     size_t approxBytesAllocated() const { return fBytesAllocated; }
     40 
     41 private:
     42     void makeSpace(size_t bytes, unsigned flags);
     43 
     44     size_t fBytesAllocated;
     45 
     46     char* fByte;
     47     unsigned fRemaining;
     48     unsigned fLgSize;
     49 
     50     struct Block;
     51     Block* fBlock;
     52 };
     53 SK_COMPILE_ASSERT(sizeof(SkVarAlloc) <= 32, SkVarAllocSize);
     54 
     55 #endif//SkVarAlloc_DEFINED
     56