More stuff on chapter 2's array stack.
This commit is contained in:
		
							parent
							
								
									e0d8dc0171
								
							
						
					
					
						commit
						707d033d9f
					
				|  | @ -2,8 +2,41 @@ | |||
| *.fasl | ||||
| *.pyc | ||||
| *.o | ||||
| *.pdf | ||||
| .d | ||||
| 
 | ||||
| # ignore build systems | ||||
| .ninja_deps | ||||
| .ninja_log | ||||
| *.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 | ||||
| 	gzip -d -k $@.gz | ||||
|  | @ -10,3 +10,9 @@ ODS_SAMPLE_CODE_URL :=		http://opendatastructures.org/ods-cpp.tgz | |||
| ods-cpp.tgz: | ||||
| 	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 | ||||
| 
 | ||||
| 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 <ods/array.h> | ||||
| #include <ods/array_stack.h> | ||||
| using namespace std; | ||||
| using namespace ods; | ||||
| 
 | ||||
| int | ||||
| main(void) | ||||
|  | @ -10,5 +12,15 @@ main(void) | |||
| 	cout << "a[0] " << a[0] << endl; | ||||
| 	 | ||||
| 	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__ | ||||
| #define __ODS_ODS_ARRAY__ | ||||
| 
 | ||||
| #include <cassert> | ||||
| #include <cstdint> | ||||
| 
 | ||||
| namespace ods { | ||||
|  | @ -8,35 +9,34 @@ namespace ods { | |||
| template<typename T> | ||||
| class Array { | ||||
| 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) { | ||||
| 		assert(i >= 0 && static_cast<std::size_t>(i) < length); | ||||
| 		assert(i >= 0 && i < length); | ||||
| 		return a[i]; | ||||
| 	} | ||||
| 
 | ||||
| 	Array<T>& operator=(Array<T> &rhs) { | ||||
| 		if (a != nullptr) { | ||||
| 			delete a; | ||||
| 			delete[] a; | ||||
| 		} | ||||
| 		 | ||||
| 		a = rhs.a; | ||||
| 		 | ||||
| 		// I don't understand why this is done, but it's how the book defines it.
 | ||||
| 		rhs.a = nullptr; | ||||
| 		 | ||||
| 		// I put this in to prevent segfaults.
 | ||||
| 		rhs.length = 0; | ||||
| 
 | ||||
| 
 | ||||
| 		length = rhs.length; | ||||
| 
 | ||||
| 		// I put this in to prevent segfaults.
 | ||||
| 		rhs.length = 0; | ||||
| 		return *this; | ||||
| 	} | ||||
| 	 | ||||
| 	std::size_t	size(void) { return length; } | ||||
| private: | ||||
| 	T		*a; | ||||
| 	std::size_t	 length; | ||||
| }; | ||||
| 
 | ||||
| } // namespace ods
 | ||||
| 
 | ||||
| #endif // __ODS_ODS_ARRAY__
 | ||||
| #endif // __ODS_ODS_ARRAY__
 | ||||
|  |  | |||
|  | @ -1,18 +1,58 @@ | |||
| #ifndef __ODS_ODS_ARRAY_STACK__ | ||||
| #define __ODS_ODS_ARRAY_STACK__ | ||||
| 
 | ||||
| #include <iostream> | ||||
| #include <ods/array.h> | ||||
| 
 | ||||
| namespace ods { | ||||
| 
 | ||||
| 
 | ||||
| template<typename T> | ||||
| 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: | ||||
| 	Array<T>	a; | ||||
| 	int		n; | ||||
| } | ||||
| 	Array<T>	a; | ||||
| }; | ||||
| 
 | ||||
| } // namespace ods
 | ||||
| 
 | ||||
| #endif // __ODS_ODS_ARRAY_STACK__
 | ||||
| #endif // __ODS_ODS_ARRAY_STACK__
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue