Начну с самого задания. Мне нужно написать программу, реализующую работу с изменениями на примере редактора текстов.
Задачи:
1 Разработать контейнер(ы) для хранения перечня(-ей) изменений.
2 С использованием разработанных контейнеров реализовать следующие операции:
- отмена произведённых операций;
- возвращение отменённых операций.
3 Создать пользовательский интерфейс, реализующий отображение вводимого
текста, а также контейнеров отмены/возвращения. Создать помощник (wizard) для
настройки параметров отмены/возвращения.
В принципе с 2 и 3 пунктами я могу разобраться сам, но вот как написать контейнер...не могу никак сообразить. Чем можете помочь?
Код класс-контейнера, помогите настроить его под мое задание
Код:
// intarray.h
#ifndef __INT_ARRAY_H__
#define __INT_ARRAY_H__
#include <cstring> // for size_t, memcpy
namespace Container {
class IntArray {
public:
IntArray();
explicit IntArray(size_t /*size*/);
IntArray(const IntArray& /*src*/);
~IntArray();
inline size_t size() const;
inline void clear();
int& operator[] (size_t /*index*/);
void insert(size_t /*insertIndex*/, int /*value*/);
void remove(size_t /*removeIndex*/);
private:
size_t size_;
size_t reserved_;
int* data_;
inline void deleteData();
void resize(size_t /*newLength*/);
};
} // namespace Container
#endif // __INT_ARRAY_H__
// intarray.cpp
#include <assert.h>
#include "intarray.h"
using namespace Container;
IntArray::IntArray()
: size_(0), reserved_(0), data_(0) { }
IntArray::IntArray(size_t size) {
size_ = size;
reserved_ = size;
data_ = new int[size_];
}
IntArray::IntArray(const IntArray& src) {
size_ = src.size_;
reserved_ = src.reserved_;
data_ = new int[size_];
// Gee, I can fly...
memcpy(data_, src.data_, sizeof(int) * size_);
}
inline void
IntArray::deleteData() {
delete[] data_;
data_ = 0;
size_ = 0;
reserved_ = 0;
}
IntArray::~IntArray() {
deleteData();
}
inline size_t
IntArray::size() const {
return size_;
}
inline void
IntArray::clear() {
resize(0);
}
int&
IntArray::operator[](size_t index) {
assert(index >= 0 && index <= size_);
return data_[index];
}
void
IntArray::resize(size_t newSize) {
if(newSize <= 0) {
deleteData();
return;
}
int* newData = new int[newSize];
reserved_ = newSize;
if(size_ > 0) {
int elementsToCopy = (newSize > size_) ? size_ : newSize;
reserved_ = newSize - elementsToCopy;
for(int index = 0; index < elementsToCopy; index++) {
newData[index] = data_[index];
}
}
delete[] data_;
data_ = newData;
size_ = newSize;
}
void
IntArray::insert(size_t insertIndex, int value) {
if(insertIndex > size_ + reserved_){
resize(insertIndex + 10); // put 10 elements in reserve
}
if(reserved_ < size_ + 1) {
resize(size_ + 1 + 10); // put 10 elements in reserve
}
memmove(data_ + (insertIndex + 1),
data_ + insertIndex,
size_ - (insertIndex + 1) );
data_[insertIndex] = value;
}
void
IntArray::remove(size_t removeIndex) {
assert(removeIndex >= 0 && removeIndex < size_);
memmove(data_ + (removeIndex),
data_ + (removeIndex + 1),
size_ - (removeIndex + 1) );
data_[size_] = 0;
}