diff options
Diffstat (limited to 'meowpp/oo/ObjArray.h')
-rw-r--r-- | meowpp/oo/ObjArray.h | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/meowpp/oo/ObjArray.h b/meowpp/oo/ObjArray.h new file mode 100644 index 0000000..4417524 --- /dev/null +++ b/meowpp/oo/ObjArray.h @@ -0,0 +1,166 @@ +#ifndef oo_ObjArray_H__ +#define oo_ObjArray_H__ + +#include "ObjBase.h" + +#include "../Self.h" + +#include <vector> +#include <string> +#include <typeinfo> + +#include <cstdio> +#include <cstdlib> + +namespace meow { + +/*! + * @brief 純粹把 \c std::vector 包起來, 變成繼承自 ObjBase + * + * @author cathook + */ +template<class T> +class ObjArray: public ObjBase { +private: + struct Myself { + std::vector<T> array_; + Myself() { + } + ~Myself() { + } + Myself& copyFrom(Myself const& b) { + array_ = b.array_; + return *this; + } + }; + Self<Myself> const self; +public: + ObjArray(): self(true) { + } + + ObjArray(ObjArray const& a): self(false) { + self().copyFrom(a.self); + } + + ObjArray(std::vector<T> const& a): self(true) { + self()->array_ = a; + } + + ObjArray(size_t sz, T const& e): self(true) { + self()->array_.resize(sz, e); + } + + ~ObjArray() { + } + + ObjArray& copyFrom(ObjArray const& a) { + self().copyFrom(a.self); + return *this; + } + + ObjArray& referenceFrom(ObjArray const& a) { + self().referenceFrom(a.self); + return *this; + } + + size_t size() const { + return self->array_.size(); + } + bool empty() const { + return self->array_.empty(); + } + + size_t size(size_t res, T const& i) { + self()->array_.resize(res, i); + return size(); + } + + size_t size(size_t res) { + self()->array_.resize(res); + return size(); + } + + void clear() { + self()->array_.clear(); + } + + T const& entry(size_t i) const { + return self->array_[i]; + } + T const& entry(size_t i, T const& e) { + self()->array_[i] = e; + return entry(i); + } + + T const& putBack(T const& e) { + self()->array_.push_back(e); + return entry(size() - 1); + } + + bool popBack() { + if (empty()) return false; + self()->array_.pop_back(); + return true; + } + + ObjArray& operator=(ObjArray const& a) { + return copyFrom(a); + } + + T const& operator[](size_t i) const { + return self->array_[i]; + } + + T& operator[](size_t i) { + return self()->array_[i]; + } + + bool write(FILE* f, bool bin, unsigned int fg) const { + size_t sz = size(); + if (bin) { + if (fwrite(&sz, sizeof(size_t), 1, f) < 1) return false; + } + else { + if (fprintf(f, "%lu\n", sz) < 1) return false; + } + for (size_t i = 0; i < sz; i++) { + if (self->array_[i].write(f, bin, fg) == false) return false; + } + return true; + } + + bool read(FILE* f, bool bin, unsigned int fg) { + size_t sz; + if (bin) { + if (fread(&sz, sizeof(size_t), 1, f) < 1) return false; + } + else { + if (fscanf(f, "%lu\n", &sz) < 0) return false; + } + size(sz); + for (size_t i = 0; i < sz; i++) { + if (self()->array_[i].read(f, bin, fg) == false) return false; + } + return true; + } + + ObjBase* create() const { + return new ObjArray(); + } + + ObjBase* copyFrom(ObjBase const* b) { + return &(copyFrom(*b)); + } + + char const* ctype() const { + return typeid(*this).name(); + } + + std::string type() const { + return std::string(ctype()); + } +}; + +} + +#endif // oo_ObjArray_H__ |