parent
6b29693b64
commit
34573a2444
@ -0,0 +1,77 @@ |
|||||||
|
#pragma once |
||||||
|
/**
|
||||||
|
@file |
||||||
|
@brief tiny vector class
|
||||||
|
@author MITSUNARI Shigeo(@herumi) |
||||||
|
@license modified new BSD license |
||||||
|
http://opensource.org/licenses/BSD-3-Clause
|
||||||
|
*/ |
||||||
|
#include <malloc.h> |
||||||
|
#include <stddef.h> |
||||||
|
#include <algorithm> |
||||||
|
|
||||||
|
namespace mcl { |
||||||
|
template<class T> |
||||||
|
class Vector { |
||||||
|
T *p_; |
||||||
|
size_t n_; |
||||||
|
Vector(const Vector&); |
||||||
|
void operator=(const Vector&); |
||||||
|
public: |
||||||
|
Vector() : p_(0), n_(0) {} |
||||||
|
~Vector() |
||||||
|
{ |
||||||
|
free(p_); |
||||||
|
} |
||||||
|
bool resize(size_t n) |
||||||
|
{ |
||||||
|
if (n <= n_) { |
||||||
|
n_ = n; |
||||||
|
if (n == 0) { |
||||||
|
free(p_); |
||||||
|
p_ = 0; |
||||||
|
} |
||||||
|
return true; |
||||||
|
} |
||||||
|
T *q = (T*)malloc(sizeof(T) * n); |
||||||
|
if (q == 0) return false; |
||||||
|
for (size_t i = 0; i < n_; i++) { |
||||||
|
q[i] = p_[i]; |
||||||
|
} |
||||||
|
free(p_); |
||||||
|
p_ = q; |
||||||
|
n_ = n; |
||||||
|
return true; |
||||||
|
} |
||||||
|
bool copy(const Vector<T>& rhs) |
||||||
|
{ |
||||||
|
if (this == &rhs) return true; |
||||||
|
if (n_ < rhs.n_) { |
||||||
|
clear(); |
||||||
|
if (!resize(rhs.n_)) return false; |
||||||
|
} |
||||||
|
for (size_t i = 0; i < rhs.n_; i++) { |
||||||
|
p_[i] = rhs.p_[i]; |
||||||
|
} |
||||||
|
n_ = rhs.n_; |
||||||
|
return true; |
||||||
|
} |
||||||
|
void clear() |
||||||
|
{ |
||||||
|
free(p_); |
||||||
|
p_ = 0; |
||||||
|
n_ = 0; |
||||||
|
} |
||||||
|
size_t size() const { return n_; } |
||||||
|
void swap(Vector<T>& rhs) |
||||||
|
{ |
||||||
|
std::swap(p_, rhs.p_); |
||||||
|
std::swap(n_, rhs.n_); |
||||||
|
} |
||||||
|
T& operator[](size_t n) { return p_[n]; } |
||||||
|
const T& operator[](size_t n) const { return p_[n]; } |
||||||
|
T* data() { return p_; } |
||||||
|
const T* data() const { return p_; } |
||||||
|
}; |
||||||
|
} // mcl
|
||||||
|
|
@ -0,0 +1,32 @@ |
|||||||
|
#include <mcl/vector.hpp> |
||||||
|
#include <cybozu/test.hpp> |
||||||
|
|
||||||
|
CYBOZU_TEST_AUTO(resize) |
||||||
|
{ |
||||||
|
mcl::Vector<int> a, b; |
||||||
|
CYBOZU_TEST_EQUAL(a.size(), 0); |
||||||
|
CYBOZU_TEST_EQUAL(b.size(), 0); |
||||||
|
|
||||||
|
const size_t n = 3; |
||||||
|
bool ok = a.resize(n); |
||||||
|
CYBOZU_TEST_ASSERT(ok); |
||||||
|
CYBOZU_TEST_EQUAL(n, a.size()); |
||||||
|
for (size_t i = 0; i < n; i++) { |
||||||
|
a[i] = i; |
||||||
|
} |
||||||
|
ok = b.copy(a); |
||||||
|
CYBOZU_TEST_ASSERT(ok); |
||||||
|
CYBOZU_TEST_EQUAL(b.size(), n); |
||||||
|
CYBOZU_TEST_EQUAL_ARRAY(a.data(), b.data(), n); |
||||||
|
|
||||||
|
const size_t small = n - 1; |
||||||
|
ok = b.resize(small); |
||||||
|
CYBOZU_TEST_ASSERT(ok); |
||||||
|
CYBOZU_TEST_EQUAL(b.size(), small); |
||||||
|
CYBOZU_TEST_EQUAL_ARRAY(a.data(), b.data(), small); |
||||||
|
const size_t large = n * 2; |
||||||
|
ok = b.resize(large); |
||||||
|
CYBOZU_TEST_ASSERT(ok); |
||||||
|
CYBOZU_TEST_EQUAL(b.size(), large); |
||||||
|
CYBOZU_TEST_EQUAL_ARRAY(a.data(), b.data(), small); |
||||||
|
} |
Loading…
Reference in new issue