2022-06-12 16:33:55 +01:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <Orange/Core/Types.h>
|
2022-08-05 01:01:41 +01:00
|
|
|
#include <string.h>
|
2022-06-12 16:33:55 +01:00
|
|
|
|
|
|
|
namespace orange
|
|
|
|
{
|
|
|
|
template <typename T>
|
|
|
|
struct Span
|
|
|
|
{
|
|
|
|
Span(T* data, size_t size) : data(data), size(size) {}
|
|
|
|
|
|
|
|
template <size_t Count>
|
|
|
|
Span(T (&array)[Count]) : data(array), size(Count) {}
|
|
|
|
|
2022-08-03 05:33:52 +01:00
|
|
|
template <typename J>
|
|
|
|
Span(J& x)
|
|
|
|
: data(x.begin())
|
|
|
|
, size(x.end() - x.begin()) {}
|
2022-06-12 16:33:55 +01:00
|
|
|
|
|
|
|
T& operator [] (size_t idx) { return data[idx]; }
|
|
|
|
const T& operator [] (size_t idx) const { return data[idx]; }
|
|
|
|
|
2022-08-05 01:01:41 +01:00
|
|
|
template <typename J>
|
|
|
|
bool operator == (const Span<J>& other) const
|
|
|
|
{
|
|
|
|
if (other.size != size)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
for (size_t i = 0; i < size; i++)
|
|
|
|
{
|
|
|
|
if (data[i] != other.data[i])
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2022-06-12 16:33:55 +01:00
|
|
|
bool IsEmpty() const { return size == 0; }
|
|
|
|
|
2022-08-03 05:33:52 +01:00
|
|
|
T* begin() { return &data[0]; }
|
|
|
|
const T* begin() const { return &data[0]; }
|
|
|
|
|
|
|
|
T* end() { return &data[size]; }
|
|
|
|
const T* end() const { return &data[size]; }
|
|
|
|
|
|
|
|
T& front() { return data[0]; }
|
|
|
|
const T& front() const { return data[0]; }
|
2022-06-12 16:33:55 +01:00
|
|
|
|
2022-08-03 05:33:52 +01:00
|
|
|
T& back() { return data[size - 1]; }
|
|
|
|
const T& back() const { return data[size - 1]; }
|
2022-06-12 16:33:55 +01:00
|
|
|
|
2022-08-25 07:27:11 +01:00
|
|
|
void copy(void* dst)
|
2022-08-12 20:08:28 +01:00
|
|
|
{
|
|
|
|
memcpy(dst, data, sizeof(T) * size);
|
|
|
|
}
|
|
|
|
|
2022-06-12 16:33:55 +01:00
|
|
|
T* data;
|
|
|
|
size_t size;
|
|
|
|
};
|
2022-06-19 03:28:57 +01:00
|
|
|
|
2022-08-12 20:08:28 +01:00
|
|
|
struct BufferView : public Span<uint8_t>
|
|
|
|
{
|
|
|
|
using Span<uint8_t>::Span;
|
|
|
|
};
|
2022-08-05 03:26:36 +01:00
|
|
|
|
2022-08-05 01:01:41 +01:00
|
|
|
struct StringView : public Span<const char>
|
|
|
|
{
|
2022-08-05 03:26:36 +01:00
|
|
|
using Span<const char>::Span;
|
|
|
|
|
2022-08-05 01:01:41 +01:00
|
|
|
StringView(const char* str)
|
|
|
|
: Span<const char>{str, strlen(str)} {}
|
|
|
|
};
|
2022-06-19 03:28:57 +01:00
|
|
|
|
|
|
|
struct Buffer : public BufferView
|
|
|
|
{
|
2022-08-12 20:08:28 +01:00
|
|
|
using BufferView::BufferView;
|
2022-06-19 03:28:57 +01:00
|
|
|
|
|
|
|
~Buffer() { delete[] data; }
|
|
|
|
};
|
2022-08-05 03:26:36 +01:00
|
|
|
|
|
|
|
struct TextBuffer : public Span<char>
|
|
|
|
{
|
|
|
|
using Span<char>::Span;
|
|
|
|
|
|
|
|
~TextBuffer() { delete[] data; }
|
|
|
|
};
|
2022-06-12 16:33:55 +01:00
|
|
|
}
|