blob: 3eb50b498313bc715c5147e09042c8dc0046b93d [file] [log] [blame]
// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef GARNET_DRIVERS_BLUETOOTH_LIB_COMMON_SLAB_BUFFER_H_
#define GARNET_DRIVERS_BLUETOOTH_LIB_COMMON_SLAB_BUFFER_H_
#include <fbl/slab_allocator.h>
#include <zircon/assert.h>
#include "garnet/drivers/bluetooth/lib/common/byte_buffer.h"
#include "garnet/drivers/bluetooth/lib/common/slab_allocator_traits.h"
#include "lib/fxl/macros.h"
namespace btlib {
namespace common {
template <size_t BackingBufferSize>
class SlabBuffer : public MutableByteBuffer {
public:
explicit SlabBuffer(size_t size) : size_(size) {
ZX_DEBUG_ASSERT(size);
ZX_DEBUG_ASSERT(size_ <= buffer_.size());
}
// ByteBuffer overrides:
const uint8_t* data() const override { return buffer_.data(); }
size_t size() const override { return size_; }
const_iterator cbegin() const override { return buffer_.cbegin(); }
const_iterator cend() const override { return cbegin() + size_; }
// MutableByteBuffer overrides:
uint8_t* mutable_data() override { return buffer_.mutable_data(); }
void Fill(uint8_t value) override {
buffer_.mutable_view(0, size_).Fill(value);
}
private:
size_t size_;
// The backing backing buffer can have a different size from what was
// requested.
common::StaticByteBuffer<BackingBufferSize> buffer_;
FXL_DISALLOW_COPY_AND_ASSIGN(SlabBuffer);
};
namespace internal {
template <size_t BufferSize, size_t NumBuffers>
class SlabBufferImpl;
} // namespace internal
template <size_t BufferSize, size_t NumBuffers>
using SlabBufferTraits =
SlabAllocatorTraits<internal::SlabBufferImpl<BufferSize, NumBuffers>,
sizeof(SlabBuffer<BufferSize>),
NumBuffers>;
namespace internal {
template <size_t BufferSize, size_t NumBuffers>
class SlabBufferImpl
: public SlabBuffer<BufferSize>,
public fbl::SlabAllocated<SlabBufferTraits<BufferSize, NumBuffers>> {
public:
explicit SlabBufferImpl(size_t size) : SlabBuffer<BufferSize>(size) {}
private:
FXL_DISALLOW_COPY_AND_ASSIGN(SlabBufferImpl);
};
} // namespace internal
} // namespace common
} // namespace btlib
#endif // GARNET_DRIVERS_BLUETOOTH_LIB_COMMON_SLAB_BUFFER_H_