} // namespace tflite
} // namespace internal
+#include <algorithm>
+
+namespace internal
+{
+namespace tflite
+{
+namespace operand
+{
+
+struct Data
+{
+ virtual ~Data() = default;
+
+ virtual size_t size(void) const = 0;
+ virtual const uint8_t *base(void) const = 0;
+};
+
+class CachedData final : public Data
+{
+public:
+ CachedData(const uint8_t *base, size_t size) : _base{new uint8_t[size]}, _size{size}
+ {
+ std::copy(base, base + size, _base);
+ }
+
+public:
+ ~CachedData()
+ {
+ delete[] _base;
+ }
+
+public:
+ size_t size(void) const override { return _size; }
+ const uint8_t *base(void) const override { return _base; }
+
+private:
+ uint8_t *_base;
+ size_t _size;
+
+};
+
+class ExternalData final : public Data
+{
+public:
+ ExternalData(const uint8_t *base, size_t size) : _base{base}, _size{size}
+ {
+ // DO NOTHING
+ }
+
+public:
+ size_t size(void) const override { return _size; }
+ const uint8_t *base(void) const override { return _base; }
+
+private:
+ const uint8_t *_base;
+ const size_t _size;
+};
+
+} // namespace operand
+} // namespace tflite
+} // namespace internal
+
+#include <memory>
+
namespace internal
{
namespace tflite
const Shape &shape(void) const { return _shape; }
private:
+ void data(std::unique_ptr<Data> &&data) { _data = std::move(data); }
+
+public:
+ template <typename T, typename... Args> void data(Args&&... args)
+ {
+ data(std::unique_ptr<T>(new T{std::forward<Args>(args)...}));
+ }
+
+private:
const Shape _shape;
+ std::unique_ptr<Data> _data;
};
} // namespace operand
public:
const Object &at(const Index &) const;
+ Object &at(const Index &);
private:
std::vector<std::unique_ptr<Object>> _objects;
#include <cassert>
#include "model.h"
+#include "memory.h"
ResultCode
ANeuralNetworksModel_create(ANeuralNetworksModel** model)
int32_t index,
const void* buffer, size_t length)
{
+ const internal::tflite::operand::Index ind{index};
+ auto &obj = model->deref().operands().at(ind);
+
+ using internal::tflite::operand::CachedData;
+
+ obj.data<CachedData>(reinterpret_cast<const uint8_t *>(buffer), length);
+
return ANEURALNETWORKS_NO_ERROR;
}
int32_t index,
const ANeuralNetworksMemory* memory, size_t offset, size_t length)
{
+ const internal::tflite::operand::Index ind{index};
+ auto &obj = model->deref().operands().at(ind);
+
+ using internal::tflite::operand::ExternalData;
+
+ obj.data<ExternalData>(reinterpret_cast<const uint8_t *>(memory->base() + offset), length);
+
return ANEURALNETWORKS_NO_ERROR;
}