diff options
| author | gingerBill <gingerBill@users.noreply.github.com> | 2020-12-06 00:49:48 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-12-06 00:49:48 +0000 |
| commit | f0683c910231513db9adab83f7c2fca9dd8d2613 (patch) | |
| tree | 2539634b5b71caf5148d8927c9298ba20bad5246 /src/array.cpp | |
| parent | 54fbdabc380905a925ab5e922749fa2b1ccb2621 (diff) | |
| parent | ca4657fd31b9efc7ab52f7e1b6f4145d5ed28fb7 (diff) | |
Merge branch 'master' into parser-experiments
Diffstat (limited to 'src/array.cpp')
| -rw-r--r-- | src/array.cpp | 89 |
1 files changed, 87 insertions, 2 deletions
diff --git a/src/array.cpp b/src/array.cpp index 6fe54b847..dc52eeb8d 100644 --- a/src/array.cpp +++ b/src/array.cpp @@ -43,11 +43,96 @@ template <typename T> void array_set_capacity (Array<T> *array, isize capac template <typename T> Array<T> array_slice (Array<T> const &array, isize lo, isize hi); template <typename T> Array<T> array_clone (gbAllocator const &a, Array<T> const &array); - - template <typename T> void array_ordered_remove (Array<T> *array, isize index); template <typename T> void array_unordered_remove(Array<T> *array, isize index); +template <typename T> void array_copy(Array<T> *array, Array<T> const &data, isize offset); +template <typename T> void array_copy(Array<T> *array, Array<T> const &data, isize offset, isize count); + +template <typename T> T *array_end_ptr(Array<T> *array); + + +template <typename T> +struct Slice { + T *data; + isize count; + + T &operator[](isize index) { + #if !defined(NO_ARRAY_BOUNDS_CHECK) + GB_ASSERT_MSG(0 <= index && index < count, "Index %td is out of bounds ranges 0..<%td", index, count); + #endif + return data[index]; + } + + T const &operator[](isize index) const { + #if !defined(NO_ARRAY_BOUNDS_CHECK) + GB_ASSERT_MSG(0 <= index && index < count, "Index %td is out of bounds ranges 0..<%td", index, count); + #endif + return data[index]; + } +}; + +template <typename T> Slice<T> slice_from_array(Array<T> const &a); + + + +template <typename T> +Slice<T> slice_make(gbAllocator const &allocator, isize count) { + Slice<T> s = {}; + s.data = gb_alloc_array(allocator, T, count); + s.count = count; + return s; +} + + +template <typename T> +Slice<T> slice_from_array(Array<T> const &a) { + return {a.data, a.count}; +} +template <typename T> +Slice<T> slice_clone(gbAllocator const &allocator, Slice<T> const &a) { + T *data = cast(T *)gb_alloc_copy_align(allocator, a.data, a.count*gb_size_of(T), gb_align_of(T)); + return {data, a.count}; +} + +template <typename T> +Slice<T> slice_clone_from_array(gbAllocator const &allocator, Array<T> const &a) { + auto c = array_clone(allocator, a); + return {c.data, c.count}; +} + + +template <typename T> +void slice_copy(Slice<T> *slice, Slice<T> const &data, isize offset) { + gb_memmove(slice->data+offset, data.data, gb_size_of(T)*data.count); +} +template <typename T> +void slice_copy(Slice<T> *slice, Slice<T> const &data, isize offset, isize count) { + gb_memmove(slice->data+offset, data.data, gb_size_of(T)*gb_min(data.count, count)); +} + + + +template <typename T> +void slice_ordered_remove(Slice<T> *array, isize index) { + GB_ASSERT(0 <= index && index < array->count); + + isize bytes = gb_size_of(T) * (array->count-(index+1)); + gb_memmove(array->data+index, array->data+index+1, bytes); + array->count -= 1; +} + +template <typename T> +void slice_unordered_remove(Slice<T> *array, isize index) { + GB_ASSERT(0 <= index && index < array->count); + + isize n = array->count-1; + if (index != n) { + gb_memmove(array->data+index, array->data+n, gb_size_of(T)); + } + array->count -= 1; +} + template <typename T> void array_copy(Array<T> *array, Array<T> const &data, isize offset) { |