Start working on ArrayDeque.
This commit is contained in:
		
							parent
							
								
									214142583b
								
							
						
					
					
						commit
						6311eaf378
					
				| 
						 | 
				
			
			@ -1,6 +1,8 @@
 | 
			
		|||
#include <iostream>
 | 
			
		||||
#include <ods/array.h>
 | 
			
		||||
#include <ods/array_stack.h>
 | 
			
		||||
#include <ods/array_queue.h>
 | 
			
		||||
#include <ods/array_deque.h>
 | 
			
		||||
using namespace std;
 | 
			
		||||
using namespace ods;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -8,12 +10,15 @@ int
 | 
			
		|||
main(void)
 | 
			
		||||
{
 | 
			
		||||
	Array<int>	a(2);
 | 
			
		||||
	Array<int>	b(5);;
 | 
			
		||||
	Array<int>	b(5);
 | 
			
		||||
 | 
			
		||||
	cout << "=== Array ===" << endl;
 | 
			
		||||
	cout << "a[0] " << a[0] << endl;
 | 
			
		||||
	
 | 
			
		||||
	b = a;
 | 
			
		||||
	cout << "b[0] " << b[0] << endl;
 | 
			
		||||
 | 
			
		||||
	cout << "=== ArrayStack ===" << endl;
 | 
			
		||||
	ArrayStack<int>	as(5);
 | 
			
		||||
	for (int i = 0; i < 3; i++) {
 | 
			
		||||
		as.set(i, i+1);
 | 
			
		||||
| 
						 | 
				
			
			@ -30,4 +35,32 @@ main(void)
 | 
			
		|||
	as.add(0, 17);
 | 
			
		||||
	as.add(0, 1);
 | 
			
		||||
	cout << "size: " << as.size() << ", cap: " << as.cap() << endl;
 | 
			
		||||
 | 
			
		||||
	cout << "=== ArrayQueue ===" << endl;
 | 
			
		||||
	ArrayQueue<int> 	aq(5);
 | 
			
		||||
	cout << "size: " << aq.size() << ", cap: " << aq.cap() << endl;
 | 
			
		||||
	for (int i = 0; i < 100; i++) {
 | 
			
		||||
		aq.add(i);
 | 
			
		||||
	}
 | 
			
		||||
	cout << "size: " << aq.size() << ", cap: " << aq.cap() << endl;
 | 
			
		||||
	for (int i = 0; i < 100; i++) {
 | 
			
		||||
		aq.remove();
 | 
			
		||||
	}
 | 
			
		||||
	cout << "size: " << aq.size() << ", cap: " << aq.cap() << endl;
 | 
			
		||||
 | 
			
		||||
	cout << "=== ArrayDeque ===" << endl;
 | 
			
		||||
	ArrayDeque<int>	ad(1);
 | 
			
		||||
	for (int i = 0; i < 5; i++) {
 | 
			
		||||
		ad.add(0, i);
 | 
			
		||||
	}
 | 
			
		||||
	cout << "size: " << ad.size() << ", cap: " << ad.cap() << endl;
 | 
			
		||||
 | 
			
		||||
	for (int i = 0; i < 5; i++) {
 | 
			
		||||
		ad.add(ad.size() - 1, i);
 | 
			
		||||
	}
 | 
			
		||||
	cout << "size: " << ad.size() << ", cap: " << ad.cap() << endl;
 | 
			
		||||
 | 
			
		||||
	for (int i = 0; i < ad.size(); i++) {
 | 
			
		||||
		cout << i << "\t" << ad.get(i) << endl;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,75 @@
 | 
			
		|||
#ifndef __ODS_ODS_ARRAY_DEQUE_
 | 
			
		||||
#define __ODS_ODS_ARRAY_DEQUE_
 | 
			
		||||
 | 
			
		||||
#include <ods/array.h>
 | 
			
		||||
 | 
			
		||||
namespace ods {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
template<typename T>
 | 
			
		||||
class ArrayDeque {
 | 
			
		||||
public:
 | 
			
		||||
	ArrayDeque(int nlen) : a(Array<T>(nlen)), j(0), n(0) {}
 | 
			
		||||
	int size(void) { return n; }
 | 
			
		||||
	int cap(void)  { return a.length; }
 | 
			
		||||
 | 
			
		||||
	static inline int max(int x, int y) {
 | 
			
		||||
		return x > y ? x : y;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	inline int index(int i) {
 | 
			
		||||
 		auto v = (j+i) % a.length;
 | 
			
		||||
		return v;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	T get(int i) {
 | 
			
		||||
		return a[index(i)];
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	T set(int i, T x) {
 | 
			
		||||
		T y = a[index(i)];
 | 
			
		||||
		a[index(i)] = x;
 | 
			
		||||
		return y;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void add(int i, T x) {
 | 
			
		||||
		if (n + 1 > a.length) {
 | 
			
		||||
			resize();
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// if i is in the leftmost half, shift left.
 | 
			
		||||
		if (i < n/2) {
 | 
			
		||||
			j = (j == 0) ? a.length - 1 : j - 1;
 | 
			
		||||
			for (int k = 0; k <= i-1; k++) {
 | 
			
		||||
				a[index(k)] = a[index(k+1)];
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		// otherwise, shift right.
 | 
			
		||||
		else {
 | 
			
		||||
			for (int k = n; k > i; k--) {
 | 
			
		||||
				a[index(k)] = a[index(k)-1];
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		a[index(i)] = x;
 | 
			
		||||
		n++;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void resize(void) {
 | 
			
		||||
		Array<T> b(max(2 * n, 1));
 | 
			
		||||
		for (int k = 0; k < n; k++) {
 | 
			
		||||
			b[k] = a[index(k)];
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		j = 0;
 | 
			
		||||
		a = b;
 | 
			
		||||
	}
 | 
			
		||||
private:
 | 
			
		||||
	Array<T>	a;
 | 
			
		||||
	int		j;
 | 
			
		||||
	int		n;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace ods
 | 
			
		||||
 | 
			
		||||
#endif // __ODS_ODS_ARRAY_DEQUE_
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,59 @@
 | 
			
		|||
#ifndef __ODS_ODS_ARRAY_QUEUE__
 | 
			
		||||
#define __ODS_ODS_ARRAY_QUEUE__
 | 
			
		||||
 | 
			
		||||
#include <ods/array.h>
 | 
			
		||||
 | 
			
		||||
namespace ods {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
template<typename T>
 | 
			
		||||
class ArrayQueue {
 | 
			
		||||
public:
 | 
			
		||||
	ArrayQueue(int nlen) : a(Array<T>(nlen)), j(0), n(0) {}
 | 
			
		||||
	int size(void) { return n; }
 | 
			
		||||
	int cap(void)  { return a.length; }
 | 
			
		||||
 | 
			
		||||
	static inline int max(int x, int y) {
 | 
			
		||||
		return x > y ? x : y;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	bool add(T x) {
 | 
			
		||||
		if (n + 1 > a.length) {
 | 
			
		||||
			resize();
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		a[(j+n) % a.length] = x;
 | 
			
		||||
		n++;
 | 
			
		||||
		return true;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	T remove() {
 | 
			
		||||
		T x = a[j];
 | 
			
		||||
		j = (j+1) % a.length;
 | 
			
		||||
		n--;
 | 
			
		||||
 | 
			
		||||
		if (a.length >= 3*n) {
 | 
			
		||||
			resize();
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return x;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void resize(void) {
 | 
			
		||||
		Array<T> b(max(2 * n, 1));
 | 
			
		||||
		for (int k = 0; k < n; k++) {
 | 
			
		||||
			b[k] = a[(j+k) % a.length];
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		j = 0;
 | 
			
		||||
		a = b;
 | 
			
		||||
	}
 | 
			
		||||
private:
 | 
			
		||||
	Array<T>	a;
 | 
			
		||||
	int		j;
 | 
			
		||||
	int		n;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace ods
 | 
			
		||||
 | 
			
		||||
#endif // __ODS_ODS_ARRAY_QUEUE__
 | 
			
		||||
| 
						 | 
				
			
			@ -1,7 +1,6 @@
 | 
			
		|||
#ifndef __ODS_ODS_ARRAY_STACK__
 | 
			
		||||
#define __ODS_ODS_ARRAY_STACK__
 | 
			
		||||
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <ods/array.h>
 | 
			
		||||
 | 
			
		||||
namespace ods {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue