C++ stuff sorted out.

This commit is contained in:
Kyle Isom 2017-12-21 18:38:31 +00:00
parent 54be01d113
commit dad664f245
5 changed files with 121 additions and 30 deletions

1
.gitignore vendored
View File

@ -22,4 +22,5 @@ missing
# build artifacts # build artifacts
src/*.o src/*.o
src/ch??ex?? src/ch??ex??
src/*.la

View File

@ -3,14 +3,9 @@ AM_CPPFLAGS += -Wwrite-strings -Wmissing-declarations -Wno-long-long -Werror
AM_CPPFLAGS += -Wunused-variable -std=c++14 -D_XOPEN_SOURCE -O0 -g -I. AM_CPPFLAGS += -Wunused-variable -std=c++14 -D_XOPEN_SOURCE -O0 -g -I.
AM_CPPFLAGS += -fno-elide-constructors -Weffc++ AM_CPPFLAGS += -fno-elide-constructors -Weffc++
lib_LTLIBRARIES := libods.la
libods_la_SOURCES := simplist.cc
libods_la_CPPFLAGS := $(AM_CPPFLAGS)
bin_PROGRAMS := ch01ex01 ch01ex03 ch01ex04 ch01ex05 ch01ex06 bin_PROGRAMS := ch01ex01 ch01ex03 ch01ex04 ch01ex05 ch01ex06
ch01ex01_SOURCES := ch01ex01.cc ch01ex01_SOURCES := ch01ex01.cc
ch01ex03_SOURCES := ch01ex03.cc ch01ex03_SOURCES := ch01ex03.cc
ch01ex04_SOURCES := ch01ex04.cc ch01ex04_SOURCES := ch01ex04.cc
ch01ex05_SOURCES := ch01ex05.cc ch01ex05_SOURCES := ch01ex05.cc
ch01ex06_SOURCES := ch01ex06.cc ch01ex06_SOURCES := ch01ex06.cc
ch01ex06_LDADD := .libs/libods.a

View File

@ -1,8 +1,7 @@
#ifndef __ODS_LIST__ #ifndef __ODS_ODS_LIST__
#define __ODS_LIST__ #define __ODS_ODS_LIST__
#include <cstdlib>
#include <cstddef>
namespace ods { namespace ods {
@ -10,11 +9,12 @@ namespace ods {
template<typename T> template<typename T>
class List { class List {
public: public:
virtual std::size_t size(void); virtual ~List(void) {};
virtual T get(std::size_t); virtual std::size_t size(void) =0;
virtual T set(std::size_t, T); virtual T get(std::size_t) =0;
virtual void add(std::size_t, T); virtual T set(std::size_t, T) =0;
virtual T remove(std::size_t); virtual void add(std::size_t, T) =0;
virtual T remove(std::size_t) =0;
}; };
} // end namespace ods } // end namespace ods

View File

@ -1,15 +1,18 @@
#ifndef __ODS_SIMPLIST__ #ifndef __ODS_ODS_SIMPLIST__
#define __ODS_SIMPLIST__ #define __ODS_ODS_SIMPLIST__
#include <ods/list.h> #include <ods/list.h>
#include <cstddef> #include <cassert>
#include <cstdlib>
#include <stdexcept>
namespace ods { namespace ods {
template<typename T> template<typename T>
class SimpList { class SimpList : List<T> {
public: public:
SimpList(); SimpList();
~SimpList(void);
std::size_t size(void); std::size_t size(void);
T get(std::size_t); T get(std::size_t);
T set(std::size_t, T); T set(std::size_t, T);
@ -19,7 +22,86 @@ private:
T *arr; T *arr;
std::size_t cap; std::size_t cap;
std::size_t len; std::size_t len;
const std::size_t DEFAULT_SIZE = 8;
}; };
template<typename T>
SimpList<T>::SimpList()
{
arr = new T[DEFAULT_SIZE];
cap = DEFAULT_SIZE;
len = 0;
}
template<typename T>
SimpList<T>::~SimpList()
{
delete this->arr;
this->cap = 0;
this->len = 0;
}
template<typename T>
std::size_t
SimpList<T>::size(void)
{
assert(len <= cap);
return this->len;
}
template <typename T>
T
SimpList<T>::get(std::size_t i)
{
if (i >= this->len) {
throw std::invalid_argument("index out of range");
}
return this->arr[i];
}
template <typename T>
T
SimpList<T>::set(std::size_t i, T value)
{
if (i >= this->len) {
throw std::invalid_argument("index out of range");
}
// check size, grow as needed
// simple case: check append
// complex case: insertion
return value;
}
template <typename T>
void
SimpList<T>::add(std::size_t i, T value)
{
if (i >= this->len) {
throw std::invalid_argument("index out of range");
}
assert(value);
return;
}
template <typename T>
T
SimpList<T>::remove(std::size_t i)
{
if (i >= this->len) {
throw std::invalid_argument("index out of range");
}
return this->arr[i];
}
} // end namespace ods } // end namespace ods
#endif #endif

View File

@ -10,9 +10,9 @@ namespace ods {
template<typename T> template<typename T>
SimpList<T>::SimpList() SimpList<T>::SimpList()
{ {
this->arr = new T[DEFAULT_SIZE]; arr = new T[DEFAULT_SIZE];
this->cap = 0; cap = 0;
this->len = 0; len = 0;
} }
@ -21,7 +21,7 @@ std::size_t
SimpList<T>::size(void) SimpList<T>::size(void)
{ {
assert(len <= cap); assert(len <= cap);
return this->len(); return this->len;
} }
@ -29,22 +29,31 @@ template <typename T>
T T
SimpList<T>::get(std::size_t i) SimpList<T>::get(std::size_t i)
{ {
i = 0; if (i >= this->len) {
throw std::invalid_argument("invalid argument"); throw std::invalid_argument("index out of range");
}
return this->arr[i];
} }
template <typename T> template <typename T>
T T
SimpList<T>::set(std::size_t, T) SimpList<T>::set(std::size_t i, T value)
{ {
throw std::invalid_argument("invalid argument"); if (i >= this->len) {
throw std::invalid_argument("index out of range");
}
// check size, grow as needed
// simple case: check append
// complex case: insertion
return value;
} }
template <typename T> template <typename T>
void void
SimpList<T>::add(std::size_t, T) SimpList<T>::add(std::size_t i, T value)
{ {
return; return;
} }
@ -52,9 +61,13 @@ SimpList<T>::add(std::size_t, T)
template <typename T> template <typename T>
T T
SimpList<T>::remove(std::size_t) SimpList<T>::remove(std::size_t i)
{ {
throw std::invalid_argument("invalid argument"); if (i >= this->len) {
throw std::invalid_argument("index out of range");
}
return this->arr[i];
} }
} // end namespace ods } // end namespace ods