mirror of
https://github.com/bkaradzic/bx.git
synced 2026-02-17 20:52:37 +01:00
Updated tinystl.
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/*-
|
||||
* Copyright 2012 Matthew Endsley
|
||||
* Copyright 2012-1015 Matthew Endsley
|
||||
* All rights reserved
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@@ -54,6 +54,18 @@ namespace tinystl {
|
||||
buffer_destroy_range_traits(first, last, pod_traits<T>());
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
static inline void buffer_fill_urange_traits(T* first, T* last, pod_traits<T, false>) {
|
||||
for (; first < last; ++first)
|
||||
new(placeholder(), first) T();
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
static inline void buffer_fill_urange_traits(T* first, T* last, pod_traits<T, true>) {
|
||||
for (; first < last; ++first)
|
||||
*first = T();
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
static inline void buffer_fill_urange_traits(T* first, T* last, const T& value, pod_traits<T, false>) {
|
||||
for (; first < last; ++first)
|
||||
@@ -105,6 +117,11 @@ namespace tinystl {
|
||||
buffer_bmove_urange_traits(dest, first, last, pod_traits<T>());
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
static inline void buffer_fill_urange(T* first, T* last) {
|
||||
buffer_fill_urange_traits(first, last, pod_traits<T>());
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
static inline void buffer_fill_urange(T* first, T* last, const T& value) {
|
||||
buffer_fill_urange_traits(first, last, value, pod_traits<T>());
|
||||
@@ -137,6 +154,15 @@ namespace tinystl {
|
||||
b->capacity = newfirst + capacity;
|
||||
}
|
||||
|
||||
template<typename T, typename Alloc>
|
||||
static inline void buffer_resize(buffer<T, Alloc>* b, size_t size) {
|
||||
buffer_reserve(b, size);
|
||||
|
||||
buffer_fill_urange(b->last, b->first + size);
|
||||
buffer_destroy_range(b->first + size, b->last);
|
||||
b->last = b->first + size;
|
||||
}
|
||||
|
||||
template<typename T, typename Alloc>
|
||||
static inline void buffer_resize(buffer<T, Alloc>* b, size_t size, const T& value) {
|
||||
buffer_reserve(b, size);
|
||||
@@ -169,22 +195,34 @@ namespace tinystl {
|
||||
}
|
||||
|
||||
template<typename T, typename Alloc>
|
||||
static inline void buffer_insert(buffer<T, Alloc>* b, T* where, const T* first, const T* last) {
|
||||
static inline T* buffer_insert_common(buffer<T, Alloc>* b, T* where, size_t count) {
|
||||
const size_t offset = (size_t)(where - b->first);
|
||||
const size_t newsize = (size_t)((b->last - b->first) + (last - first));
|
||||
const size_t newsize = (size_t)((b->last - b->first) + count);
|
||||
if (b->first + newsize > b->capacity)
|
||||
buffer_reserve(b, (newsize * 3) / 2);
|
||||
|
||||
where = b->first + offset;
|
||||
const size_t count = (size_t)(last - first);
|
||||
|
||||
if (where != b->last)
|
||||
buffer_bmove_urange(where + count, where, b->last);
|
||||
|
||||
b->last = b->first + newsize;
|
||||
|
||||
return where;
|
||||
}
|
||||
|
||||
template<typename T, typename Alloc, typename Param>
|
||||
static inline void buffer_insert(buffer<T, Alloc>* b, T* where, const Param* first, const Param* last) {
|
||||
where = buffer_insert_common(b, where, last - first);
|
||||
for (; first != last; ++first, ++where)
|
||||
new(placeholder(), where) T(*first);
|
||||
}
|
||||
|
||||
b->last = b->first + newsize;
|
||||
template<typename T, typename Alloc>
|
||||
static inline void buffer_insert(buffer<T, Alloc>* b, T* where, size_t count) {
|
||||
where = buffer_insert_common(b, where, count);
|
||||
for (size_t i = 0; i < count; ++i)
|
||||
new(placeholder(), where) T();
|
||||
}
|
||||
|
||||
template<typename T, typename Alloc>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*-
|
||||
* Copyright 2012 Matthew Endsley
|
||||
* Copyright 2012-1015 Matthew Endsley
|
||||
* All rights reserved
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@@ -56,6 +56,8 @@ namespace tinystl {
|
||||
T& operator[](size_t idx);
|
||||
const T& operator[](size_t idx) const;
|
||||
|
||||
const T& front() const;
|
||||
T& front();
|
||||
const T& back() const;
|
||||
T& back();
|
||||
|
||||
@@ -67,6 +69,10 @@ namespace tinystl {
|
||||
void push_back(const T& t);
|
||||
void pop_back();
|
||||
|
||||
void emplace_back();
|
||||
template<typename Param>
|
||||
void emplace_back(const Param& param);
|
||||
|
||||
void shrink_to_fit();
|
||||
|
||||
void swap(vector& other);
|
||||
@@ -81,9 +87,13 @@ namespace tinystl {
|
||||
const_iterator begin() const;
|
||||
const_iterator end() const;
|
||||
|
||||
void insert(iterator where);
|
||||
void insert(iterator where, const T& value);
|
||||
void insert(iterator where, const T* first, const T* last);
|
||||
|
||||
template<typename Param>
|
||||
void emplace(iterator where, const Param& param);
|
||||
|
||||
iterator erase(iterator where);
|
||||
iterator erase(iterator first, iterator last);
|
||||
|
||||
@@ -109,7 +119,7 @@ namespace tinystl {
|
||||
template<typename T, typename Alloc>
|
||||
inline vector<T, Alloc>::vector(size_t _size) {
|
||||
buffer_init(&m_buffer);
|
||||
buffer_resize(&m_buffer, _size, T());
|
||||
buffer_resize(&m_buffer, _size);
|
||||
}
|
||||
|
||||
template<typename T, typename Alloc>
|
||||
@@ -176,6 +186,16 @@ namespace tinystl {
|
||||
return m_buffer.first[idx];
|
||||
}
|
||||
|
||||
template<typename T, typename Alloc>
|
||||
inline const T& vector<T, Alloc>::front() const {
|
||||
return m_buffer.first[0];
|
||||
}
|
||||
|
||||
template<typename T, typename Alloc>
|
||||
inline T& vector<T, Alloc>::front() {
|
||||
return m_buffer.first[0];
|
||||
}
|
||||
|
||||
template<typename T, typename Alloc>
|
||||
inline const T& vector<T, Alloc>::back() const {
|
||||
return m_buffer.last[-1];
|
||||
@@ -188,7 +208,7 @@ namespace tinystl {
|
||||
|
||||
template<typename T, typename Alloc>
|
||||
inline void vector<T, Alloc>::resize(size_t _size) {
|
||||
buffer_resize(&m_buffer, _size, T());
|
||||
buffer_resize(&m_buffer, _size);
|
||||
}
|
||||
|
||||
template<typename T, typename Alloc>
|
||||
@@ -211,6 +231,19 @@ namespace tinystl {
|
||||
buffer_insert(&m_buffer, m_buffer.last, &t, &t + 1);
|
||||
}
|
||||
|
||||
template<typename T, typename Alloc>
|
||||
inline void vector<T, Alloc>::emplace_back()
|
||||
{
|
||||
buffer_insert(&m_buffer, m_buffer.last, 1);
|
||||
}
|
||||
|
||||
template<typename T, typename Alloc>
|
||||
template<typename Param>
|
||||
inline void vector<T, Alloc>::emplace_back(const Param& param)
|
||||
{
|
||||
buffer_insert(&m_buffer, m_buffer.last, ¶m, ¶m + 1);
|
||||
}
|
||||
|
||||
template<typename T, typename Alloc>
|
||||
inline void vector<T, Alloc>::pop_back() {
|
||||
buffer_erase(&m_buffer, m_buffer.last - 1, m_buffer.last);
|
||||
@@ -246,6 +279,11 @@ namespace tinystl {
|
||||
return m_buffer.last;
|
||||
}
|
||||
|
||||
template<typename T, typename Alloc>
|
||||
inline void vector<T, Alloc>::insert(vector::iterator where) {
|
||||
buffer_insert(&m_buffer, where, 1);
|
||||
}
|
||||
|
||||
template<typename T, typename Alloc>
|
||||
inline void vector<T, Alloc>::insert(iterator where, const T& value) {
|
||||
buffer_insert(&m_buffer, where, &value, &value + 1);
|
||||
@@ -275,6 +313,12 @@ namespace tinystl {
|
||||
inline typename vector<T, Alloc>::iterator vector<T, Alloc>::erase_unordered(iterator first, iterator last) {
|
||||
return buffer_erase_unordered(&m_buffer, first, last);
|
||||
}
|
||||
|
||||
template<typename T, typename Alloc>
|
||||
template<typename Param>
|
||||
void vector<T, Alloc>::emplace(vector::iterator where, const Param& param) {
|
||||
buffer_insert(&m_buffer, where, ¶m, ¶m + 1);
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user