--- /dev/null
+#ifndef __NNCC_FOUNDATION_EXTERNAL_REGION_H__
+#define __NNCC_FOUNDATION_EXTERNAL_REGION_H__
+
+#include "nncc/foundation/Region.h"
+
+namespace nncc
+{
+namespace foundation
+{
+
+template <typename T> class ExternalRegion final : public Region<T>
+{
+public:
+ ExternalRegion(T *base, uint32_t size) : _base{base}, _size{size}
+ {
+ // DO NOTHING
+ }
+
+public:
+ T *base(void) override { return _base; }
+ uint32_t size(void) const override { return _size; }
+
+private:
+ T *const _base;
+ uint32_t const _size;
+};
+
+} // namespace foundation
+} // namespace nncc
+
+#endif // __NNCC_FOUNDATION_EXTERNAL_REGION_H__
--- /dev/null
+#ifndef __NNCC_FOUNDATION_OWNED_REGION_H__
+#define __NNCC_FOUNDATION_OWNED_REGION_H__
+
+#include "nncc/foundation/Region.h"
+
+namespace nncc
+{
+namespace foundation
+{
+
+template <typename T> class OwnedRegion final : public Region<T>
+{
+public:
+ OwnedRegion(uint32_t size) : _base{new T[size]}, _size{size}
+ {
+ // DO NOTHING
+ }
+
+public:
+ ~OwnedRegion() { delete[] _base; }
+
+public:
+ T *base(void) override { return _base; }
+ uint32_t size(void) const override { return _size; }
+
+private:
+ T *const _base;
+ uint32_t const _size;
+};
+
+} // namespace foundation
+} // namespace nncc
+
+#endif // __NNCC_FOUNDATION_OWNED_REGION_H__
--- /dev/null
+#ifndef __NNCC_FOUNDATION_REGION_H__
+#define __NNCC_FOUNDATION_REGION_H__
+
+#include <cstdint>
+
+namespace nncc
+{
+namespace foundation
+{
+
+template <typename T> struct Region
+{
+ virtual ~Region() = default;
+
+ virtual T *base(void) = 0;
+ virtual uint32_t size(void) const = 0;
+};
+
+} // namespace foundation
+} // namespace nncc
+
+#endif // __NNCC_FOUNDATION_REGION_H__
--- /dev/null
+#include <nncc/foundation/ExternalRegion.h>
+
+#include <gtest/gtest.h>
+
+TEST(FOUNDATION_EXTERNAL_REGION, ctor)
+{
+ int buffer[1];
+
+ nncc::foundation::ExternalRegion<int> r{buffer, 1};
+
+ ASSERT_EQ(r.size(), 1);
+ ASSERT_EQ(r.base(), buffer);
+}
--- /dev/null
+#include <nncc/foundation/OwnedRegion.h>
+
+#include <gtest/gtest.h>
+
+TEST(FOUNDATION_OWNED_REGION, ctor)
+{
+ nncc::foundation::OwnedRegion<int> r{1};
+
+ ASSERT_EQ(r.size(), 1);
+ ASSERT_NE(r.base(), nullptr);
+}