[ox/mc] Add basic walking of data by data descriptor
This commit is contained in:
4
deps/ox/src/ox/std/hashmap.hpp
vendored
4
deps/ox/src/ox/std/hashmap.hpp
vendored
@@ -18,8 +18,8 @@ class HashMap {
|
||||
|
||||
private:
|
||||
struct Pair {
|
||||
K key;
|
||||
T value;
|
||||
K key = {};
|
||||
T value = {};
|
||||
};
|
||||
Vector<K> m_keys;
|
||||
Vector<Pair*> m_pairs;
|
||||
|
2
deps/ox/src/ox/std/string.hpp
vendored
2
deps/ox/src/ox/std/string.hpp
vendored
@@ -10,7 +10,7 @@
|
||||
|
||||
#include "memops.hpp"
|
||||
#include "strops.hpp"
|
||||
#include "types.hpp"
|
||||
#include "typetraits.hpp"
|
||||
|
||||
namespace ox {
|
||||
|
||||
|
20
deps/ox/src/ox/std/utility.hpp
vendored
Normal file
20
deps/ox/src/ox/std/utility.hpp
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
/*
|
||||
* Copyright 2015 - 2019 gtalent2@gmail.com
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "typetraits.hpp"
|
||||
|
||||
namespace ox {
|
||||
|
||||
template<typename T>
|
||||
constexpr typename ox::remove_reference<T>::type &&move(T &&t) noexcept {
|
||||
return static_cast<typename ox::remove_reference<T>::type&&>(t);
|
||||
}
|
||||
|
||||
}
|
48
deps/ox/src/ox/std/vector.hpp
vendored
48
deps/ox/src/ox/std/vector.hpp
vendored
@@ -9,6 +9,7 @@
|
||||
#pragma once
|
||||
|
||||
#include "types.hpp"
|
||||
#include "utility.hpp"
|
||||
|
||||
namespace ox {
|
||||
|
||||
@@ -39,6 +40,14 @@ class Vector {
|
||||
|
||||
const T &operator[](std::size_t i) const noexcept;
|
||||
|
||||
T &front() noexcept;
|
||||
|
||||
const T &front() const noexcept;
|
||||
|
||||
T &back() noexcept;
|
||||
|
||||
const T &back() const noexcept;
|
||||
|
||||
std::size_t size() const noexcept;
|
||||
|
||||
void resize(std::size_t size) noexcept;
|
||||
@@ -47,6 +56,9 @@ class Vector {
|
||||
|
||||
bool contains(T) const noexcept;
|
||||
|
||||
template<typename... Args>
|
||||
void emplace_back(Args&&... args) noexcept;
|
||||
|
||||
void push_back(const T &item) noexcept;
|
||||
|
||||
void pop_back() noexcept;
|
||||
@@ -85,7 +97,7 @@ Vector<T>::Vector(Vector<T> &other) noexcept {
|
||||
m_cap = other.m_cap;
|
||||
m_items = new T[m_cap];
|
||||
for (std::size_t i = 0; i < m_size; i++) {
|
||||
m_items[i] = other.m_items[i];
|
||||
m_items[i] = ox::move(other.m_items[i]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -139,6 +151,26 @@ const T &Vector<T>::operator[](std::size_t i) const noexcept {
|
||||
return m_items[i];
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
T &Vector<T>::front() noexcept {
|
||||
return m_items[0];
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
const T &Vector<T>::front() const noexcept {
|
||||
return m_items[0];
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
T &Vector<T>::back() noexcept {
|
||||
return m_items[m_size - 1];
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
const T &Vector<T>::back() const noexcept {
|
||||
return m_items[m_size - 1];
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
std::size_t Vector<T>::size() const noexcept {
|
||||
return m_size;
|
||||
@@ -170,6 +202,16 @@ bool Vector<T>::contains(T v) const noexcept {
|
||||
return false;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
template<typename... Args>
|
||||
void Vector<T>::emplace_back(Args&&... args) noexcept {
|
||||
if (m_size == m_cap) {
|
||||
expandCap(m_cap ? m_cap * 2 : 100);
|
||||
}
|
||||
new (&m_items[m_size]) T{args...};
|
||||
++m_size;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
void Vector<T>::push_back(const T &item) noexcept {
|
||||
if (m_size == m_cap) {
|
||||
@@ -206,10 +248,10 @@ void Vector<T>::expandCap(std::size_t cap) noexcept {
|
||||
if (oldItems) { // move over old items
|
||||
const auto itRange = cap > m_size ? m_size : cap;
|
||||
for (std::size_t i = 0; i < itRange; i++) {
|
||||
m_items[i] = oldItems[i];
|
||||
m_items[i] = ox::move(oldItems[i]);
|
||||
}
|
||||
for (std::size_t i = itRange; i < m_cap; i++) {
|
||||
m_items[i] = T();
|
||||
new (&m_items[i]) T;
|
||||
}
|
||||
delete[] oldItems;
|
||||
}
|
||||
|
Reference in New Issue
Block a user