aboutsummaryrefslogtreecommitdiff
path: root/test/SemaTemplate/example-dynarray.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/SemaTemplate/example-dynarray.cpp')
-rw-r--r--test/SemaTemplate/example-dynarray.cpp177
1 files changed, 0 insertions, 177 deletions
diff --git a/test/SemaTemplate/example-dynarray.cpp b/test/SemaTemplate/example-dynarray.cpp
deleted file mode 100644
index 999521e91e..0000000000
--- a/test/SemaTemplate/example-dynarray.cpp
+++ /dev/null
@@ -1,177 +0,0 @@
-// RUN: %clangxx -emit-llvm -c -o - %s
-#include <stddef.h>
-#include <stdlib.h>
-#include <assert.h>
-
-// Placement new requires <new> to be included, but we don't support that yet.
-void* operator new(size_t, void* ptr) throw() {
- return ptr;
-}
-void operator delete(void*, void*) throw() {
-}
-
-template<typename T>
-class dynarray {
-public:
- dynarray() { Start = Last = End = 0; }
-
- dynarray(const dynarray &other) {
- Start = (T*)malloc(sizeof(T) * other.size());
- Last = End = Start + other.size();
-
- for (unsigned I = 0, N = other.size(); I != N; ++I)
- new (Start + I) T(other[I]);
- }
-
- ~dynarray() {
- for (unsigned I = 0, N = size(); I != N; ++I)
- Start[I].~T();
-
- free(Start);
- }
-
- dynarray &operator=(const dynarray &other) {
- T* NewStart = (T*)malloc(sizeof(T) * other.size());
-
- for (unsigned I = 0, N = other.size(); I != N; ++I)
- new (NewStart + I) T(other[I]);
-
- for (unsigned I = 0, N = size(); I != N; ++I)
- Start[I].~T();
-
- free(Start);
- Start = NewStart;
- Last = End = NewStart + other.size();
- return *this;
- }
-
- unsigned size() const { return Last - Start; }
- unsigned capacity() const { return End - Start; }
-
- void push_back(const T& value);
-
- void pop_back() {
- --Last;
- Last->~T();
- }
-
- T& operator[](unsigned Idx) {
- return Start[Idx];
- }
-
- const T& operator[](unsigned Idx) const {
- return Start[Idx];
- }
-
- typedef T* iterator;
- typedef const T* const_iterator;
-
- iterator begin() { return Start; }
- const_iterator begin() const { return Start; }
-
- iterator end() { return Last; }
- const_iterator end() const { return Last; }
-
- bool operator==(const dynarray &other) const {
- if (size() != other.size())
- return false;
-
- for (unsigned I = 0, N = size(); I != N; ++I)
- if ((*this)[I] != other[I])
- return false;
-
- return true;
- }
-
- bool operator!=(const dynarray &other) const {
- return !(*this == other);
- }
-
-public:
- T* Start, *Last, *End;
-};
-
-template<typename T>
-void dynarray<T>::push_back(const T& value) {
- if (Last == End) {
- unsigned NewCapacity = capacity() * 2;
- if (NewCapacity == 0)
- NewCapacity = 4;
-
- T* NewStart = (T*)malloc(sizeof(T) * NewCapacity);
-
- unsigned Size = size();
- for (unsigned I = 0; I != Size; ++I)
- new (NewStart + I) T(Start[I]);
-
- for (unsigned I = 0, N = size(); I != N; ++I)
- Start[I].~T();
- free(Start);
-
- Start = NewStart;
- Last = Start + Size;
- End = Start + NewCapacity;
- }
-
- new (Last) T(value);
- ++Last;
-}
-
-struct Point {
- Point() { x = y = z = 0.0; }
- Point(const Point& other) : x(other.x), y(other.y), z(other.z) { }
-
- float x, y, z;
-};
-
-int main() {
- dynarray<int> di;
- di.push_back(0);
- di.push_back(1);
- di.push_back(2);
- di.push_back(3);
- di.push_back(4);
- assert(di.size() == 5);
- for (dynarray<int>::iterator I = di.begin(), IEnd = di.end(); I != IEnd; ++I)
- assert(*I == I - di.begin());
-
- for (int I = 0, N = di.size(); I != N; ++I)
- assert(di[I] == I);
-
- di.pop_back();
- assert(di.size() == 4);
- di.push_back(4);
-
- dynarray<int> di2 = di;
- assert(di2.size() == 5);
- assert(di.begin() != di2.begin());
- for (dynarray<int>::iterator I = di2.begin(), IEnd = di2.end();
- I != IEnd; ++I)
- assert(*I == I - di2.begin());
-
- dynarray<int> di3(di);
- assert(di3.size() == 5);
- assert(di.begin() != di3.begin());
- for (dynarray<int>::iterator I = di3.begin(), IEnd = di3.end();
- I != IEnd; ++I)
- assert(*I == I - di3.begin());
-
- dynarray<int> di4;
- assert(di4.size() == 0);
- di4 = di;
- assert(di4.size() == 5);
- assert(di.begin() != di4.begin());
- for (dynarray<int>::iterator I = di4.begin(), IEnd = di4.end();
- I != IEnd; ++I)
- assert(*I == I - di4.begin());
-
- assert(di4 == di);
- di4[3] = 17;
- assert(di4 != di);
-
- dynarray<Point> dp;
- dp.push_back(Point());
- assert(dp.size() == 1);
-
- return 0;
-}