More stuff on chapter 2's array stack.
This commit is contained in:
		
							parent
							
								
									e0d8dc0171
								
							
						
					
					
						commit
						707d033d9f
					
				| 
						 | 
					@ -2,8 +2,41 @@
 | 
				
			||||||
*.fasl
 | 
					*.fasl
 | 
				
			||||||
*.pyc
 | 
					*.pyc
 | 
				
			||||||
*.o
 | 
					*.o
 | 
				
			||||||
 | 
					*.pdf
 | 
				
			||||||
 | 
					.d
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# ignore build systems
 | 
					# ignore build systems
 | 
				
			||||||
.ninja_deps
 | 
					.ninja_deps
 | 
				
			||||||
.ninja_log
 | 
					.ninja_log
 | 
				
			||||||
*.ninja
 | 
					*.ninja
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# editor crap
 | 
				
			||||||
 | 
					.vscode/*
 | 
				
			||||||
 | 
					!.vscode/settings.json
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# data files
 | 
				
			||||||
 | 
					ods/data/corpus.txt
 | 
				
			||||||
 | 
					ods/data/cpp
 | 
				
			||||||
 | 
					ods/data/ods-cpp.tgz
 | 
				
			||||||
 | 
					ods/data/ods-cpp.pdf
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# autotools junk files
 | 
				
			||||||
 | 
					.deps
 | 
				
			||||||
 | 
					Makefile
 | 
				
			||||||
 | 
					Makefile.in
 | 
				
			||||||
 | 
					aclocal.m4
 | 
				
			||||||
 | 
					autom4te.cache/
 | 
				
			||||||
 | 
					compile
 | 
				
			||||||
 | 
					config.*
 | 
				
			||||||
 | 
					configure
 | 
				
			||||||
 | 
					depcomp
 | 
				
			||||||
 | 
					install-sh
 | 
				
			||||||
 | 
					libtool
 | 
				
			||||||
 | 
					ltmain.sh
 | 
				
			||||||
 | 
					m4/
 | 
				
			||||||
 | 
					missing
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ch??ex??
 | 
				
			||||||
 | 
					*_test
 | 
				
			||||||
 | 
					*.la
 | 
				
			||||||
 | 
					*_bench
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,3 @@
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						"cppcheck.includePaths": ["${workspaceRoot}/ods/src"]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -1,26 +0,0 @@
 | 
				
			||||||
# data files
 | 
					 | 
				
			||||||
data/corpus.txt
 | 
					 | 
				
			||||||
data/cpp
 | 
					 | 
				
			||||||
data/ods-cpp.tgz
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# autotools junk files
 | 
					 | 
				
			||||||
.deps
 | 
					 | 
				
			||||||
Makefile
 | 
					 | 
				
			||||||
Makefile.in
 | 
					 | 
				
			||||||
aclocal.m4
 | 
					 | 
				
			||||||
autom4te.cache/
 | 
					 | 
				
			||||||
compile
 | 
					 | 
				
			||||||
config.*
 | 
					 | 
				
			||||||
configure
 | 
					 | 
				
			||||||
depcomp
 | 
					 | 
				
			||||||
install-sh
 | 
					 | 
				
			||||||
libtool
 | 
					 | 
				
			||||||
ltmain.sh
 | 
					 | 
				
			||||||
m4/
 | 
					 | 
				
			||||||
missing
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# build artifacts
 | 
					 | 
				
			||||||
src/*.o
 | 
					 | 
				
			||||||
src/ch??ex??
 | 
					 | 
				
			||||||
src/*.la
 | 
					 | 
				
			||||||
src/*_bench
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,4 +1,4 @@
 | 
				
			||||||
pkgdata_DATA = corpus.txt ods-cpp/main.cpp
 | 
					pkgdata_DATA = corpus.txt ods-cpp/main.cpp ods-cpp.pdf
 | 
				
			||||||
 | 
					
 | 
				
			||||||
corpus.txt: corpus.txt.gz
 | 
					corpus.txt: corpus.txt.gz
 | 
				
			||||||
	gzip -d -k $@.gz
 | 
						gzip -d -k $@.gz
 | 
				
			||||||
| 
						 | 
					@ -10,3 +10,9 @@ ODS_SAMPLE_CODE_URL :=		http://opendatastructures.org/ods-cpp.tgz
 | 
				
			||||||
ods-cpp.tgz:
 | 
					ods-cpp.tgz:
 | 
				
			||||||
	if command -v curl 2>&1 > /dev/null ; then curl -L -O $(ODS_SAMPLE_CODE_URL) ; \
 | 
						if command -v curl 2>&1 > /dev/null ; then curl -L -O $(ODS_SAMPLE_CODE_URL) ; \
 | 
				
			||||||
	elif command -v curl 2>&1 > /dev/null ; then wget $(ODS_SAMPLE_CODE_URL) ; fi
 | 
						elif command -v curl 2>&1 > /dev/null ; then wget $(ODS_SAMPLE_CODE_URL) ; fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ODS_PDF_URL :=			http://opendatastructures.org/ods-cpp.pdf
 | 
				
			||||||
 | 
					ods-cpp.pdf:
 | 
				
			||||||
 | 
						if command -v curl 2>&1 > /dev/null ; then curl -L -O $(ODS_PDF_URL) ; \
 | 
				
			||||||
 | 
						elif command -v curl 2>&1 > /dev/null ; then wget $(ODS_PDF_URL) ; fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,8 @@
 | 
				
			||||||
#include <iostream>
 | 
					#include <iostream>
 | 
				
			||||||
#include <ods/array.h>
 | 
					#include <ods/array.h>
 | 
				
			||||||
 | 
					#include <ods/array_stack.h>
 | 
				
			||||||
using namespace std;
 | 
					using namespace std;
 | 
				
			||||||
 | 
					using namespace ods;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int
 | 
					int
 | 
				
			||||||
main(void)
 | 
					main(void)
 | 
				
			||||||
| 
						 | 
					@ -10,5 +12,15 @@ main(void)
 | 
				
			||||||
	cout << "a[0] " << a[0] << endl;
 | 
						cout << "a[0] " << a[0] << endl;
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	b = a;
 | 
						b = a;
 | 
				
			||||||
	cout << "a[0] " << a[0] << endl;
 | 
						cout << "b[0] " << b[0] << endl;
 | 
				
			||||||
}
 | 
					
 | 
				
			||||||
 | 
						ArrayStack<int>	as(5);
 | 
				
			||||||
 | 
						for (int i = 0; i < 3; i++) {
 | 
				
			||||||
 | 
							as.set(i, i+1);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						as.add(1, 42);
 | 
				
			||||||
 | 
						cout << "as[0] " << as.get(0) << endl;
 | 
				
			||||||
 | 
						cout << "as[1] " << as.get(1) << endl;
 | 
				
			||||||
 | 
						as.remove(0);
 | 
				
			||||||
 | 
						cout << "as[0] " << as.get(0) << endl;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,7 @@
 | 
				
			||||||
#ifndef __ODS_ODS_ARRAY__
 | 
					#ifndef __ODS_ODS_ARRAY__
 | 
				
			||||||
#define __ODS_ODS_ARRAY__
 | 
					#define __ODS_ODS_ARRAY__
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <cassert>
 | 
				
			||||||
#include <cstdint>
 | 
					#include <cstdint>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace ods {
 | 
					namespace ods {
 | 
				
			||||||
| 
						 | 
					@ -8,35 +9,34 @@ namespace ods {
 | 
				
			||||||
template<typename T>
 | 
					template<typename T>
 | 
				
			||||||
class Array {
 | 
					class Array {
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
	Array(int len) : length(len) { a = new T[length]; }
 | 
						T	*a;
 | 
				
			||||||
 | 
						int	 length;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Array(int len) : a(new T[len]), length(len) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	T& operator[](int i) {
 | 
						T& operator[](int i) {
 | 
				
			||||||
		assert(i >= 0 && static_cast<std::size_t>(i) < length);
 | 
							assert(i >= 0 && i < length);
 | 
				
			||||||
		return a[i];
 | 
							return a[i];
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Array<T>& operator=(Array<T> &rhs) {
 | 
						Array<T>& operator=(Array<T> &rhs) {
 | 
				
			||||||
		if (a != nullptr) {
 | 
							if (a != nullptr) {
 | 
				
			||||||
			delete a;
 | 
								delete[] a;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		a = rhs.a;
 | 
							a = rhs.a;
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		// I don't understand why this is done, but it's how the book defines it.
 | 
							// I don't understand why this is done, but it's how the book defines it.
 | 
				
			||||||
		rhs.a = nullptr;
 | 
							rhs.a = nullptr;
 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		// I put this in to prevent segfaults.
 | 
					 | 
				
			||||||
		rhs.length = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		length = rhs.length;
 | 
							length = rhs.length;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// I put this in to prevent segfaults.
 | 
				
			||||||
 | 
							rhs.length = 0;
 | 
				
			||||||
		return *this;
 | 
							return *this;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	std::size_t	size(void) { return length; }
 | 
					 | 
				
			||||||
private:
 | 
					 | 
				
			||||||
	T		*a;
 | 
					 | 
				
			||||||
	std::size_t	 length;
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
} // namespace ods
 | 
					} // namespace ods
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif // __ODS_ODS_ARRAY__
 | 
					#endif // __ODS_ODS_ARRAY__
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,18 +1,58 @@
 | 
				
			||||||
#ifndef __ODS_ODS_ARRAY_STACK__
 | 
					#ifndef __ODS_ODS_ARRAY_STACK__
 | 
				
			||||||
#define __ODS_ODS_ARRAY_STACK__
 | 
					#define __ODS_ODS_ARRAY_STACK__
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <iostream>
 | 
				
			||||||
 | 
					#include <ods/array.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace ods {
 | 
					namespace ods {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template<typename T>
 | 
					template<typename T>
 | 
				
			||||||
class ArrayStack {
 | 
					class ArrayStack {
 | 
				
			||||||
	int size(void) { return static_cast<int>(this->a->size()); }
 | 
					public:
 | 
				
			||||||
 | 
						ArrayStack(int len) : n(0), a(Array<T>(len)) {}
 | 
				
			||||||
 | 
						int size(void) { return a.length; }
 | 
				
			||||||
 | 
						T get(int i) { return a[i]; }
 | 
				
			||||||
 | 
						T set(int i, T x) { 
 | 
				
			||||||
 | 
							T y = a[i];
 | 
				
			||||||
 | 
							a[i] = x;
 | 
				
			||||||
 | 
							return y;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void add(int i, T x) {
 | 
				
			||||||
 | 
							if (n+1 > a.length) {
 | 
				
			||||||
 | 
								resize();
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							for (int j = n; j > i; j--) {
 | 
				
			||||||
 | 
								a[j] = a[j-1];
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							a[i] = x;
 | 
				
			||||||
 | 
							n++;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						T remove(int i) {
 | 
				
			||||||
 | 
							T x = a[i];
 | 
				
			||||||
 | 
							for (int j = i; j < (n-1); j++) {
 | 
				
			||||||
 | 
								std::cout << j << "\t" << i << "\t" << a[j] << std::endl;
 | 
				
			||||||
 | 
								a[j] = a[j+1];
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							n--;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (a.length > 3*n) {
 | 
				
			||||||
 | 
								resize();
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							return x;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void resize(void) {}
 | 
				
			||||||
private:
 | 
					private:
 | 
				
			||||||
	Array<T>	a;
 | 
					 | 
				
			||||||
	int		n;
 | 
						int		n;
 | 
				
			||||||
}
 | 
						Array<T>	a;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
} // namespace ods
 | 
					} // namespace ods
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif // __ODS_ODS_ARRAY_STACK__
 | 
					#endif // __ODS_ODS_ARRAY_STACK__
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue