/*
* Copyright © 2014 Canonical Ltd.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see .
*
* Authored by: Alexandros Frantzis
*/
#ifndef ANBOX_COMMON_VARIABLE_LENGTH_ARRAY_H_
#define ANBOX_COMMON_VARIABLE_LENGTH_ARRAY_H_
#include
#include
namespace anbox {
template
class VariableLengthArray {
public:
explicit VariableLengthArray(size_t size) : size_{size} {
/* Don't call resize if the initial values of member variables are valid */
if (size > BuiltInBufferSize) resize(size);
}
void resize(size_t size) {
if (size > BuiltInBufferSize)
effective_buffer = BufferUPtr{new unsigned char[size], heap_deleter};
else
effective_buffer = BufferUPtr{builtin_buffer, null_deleter};
size_ = size;
}
unsigned char* data() const { return effective_buffer.get(); }
size_t size() const { return size_; }
private:
typedef std::unique_ptr BufferUPtr;
static void null_deleter(unsigned char*) {}
static void heap_deleter(unsigned char* b) { delete[] b; }
unsigned char builtin_buffer[BuiltInBufferSize];
BufferUPtr effective_buffer{builtin_buffer, null_deleter};
size_t size_;
};
} // namespace anbox
#endif