replaced http://codereview.stackexchange.com/ with https://codereview.stackexchange.com/
template<typename T>
class Ptr {
public:
Ptr(T* t, int s = 1) : sz{s<1 ? throw std::logic_error("Invalid sz parameter") : s} {
sz = s;
p = new T[sz];
std::copy(t,t+sz,p);
}
Ptr(const Ptr& t) : Ptr(t.p, t.sz) { }
Ptr& operator=(Ptr copy) {
std::swap(copy.sz, sz);
std::swap(copy.p, p);
return *this;
}
Ptr(Ptr &&t) :p{t.p}, sz{t.sz} {
t.p = nullptr;
t.sz = 0;
}
Ptr& operator=(Ptr &&t) {
std::swap(t.p,p);
std::swap(t.sz,sz);
return *this;
}
T& operator*() {
check_range(index);
return p[index];
}
T& operator[](int i) {
check_range(i);
return p[i];
}
T* get() const {
return p;
}
void operator+=(int i) {
check_range(index+i);
index += i;
}
void operator-=(int i) {
operator+=(-i);
}
Ptr operator+(int i) {
Ptr old{*this};
old += index+i;
return old;
}
Ptr operator-(int i) {
return operator+(-i);
}
Ptr& operator++() {
operator+=(1);
return *this;
}
Ptr operator++(int) {
Ptr old{p+index};
operator++();
return old;
}
Ptr& operator--() {
operator-=(1);
return *this;
}
Ptr operator--(int) {
Ptr<T> old{p+index};
operator--();
return old;
}
~Ptr() {
delete[] p;
}
private:
T* p;
int sz;
int index = 0;
void check_range(int i) {
if (i < 0 || i > sz-1) {
throw std::out_of_range("out of range");
}
if (p+indexp+i == nullptr) {
throw std::out_of_range("null pointer");
}
}
};
template<typename T>
class Ptr {
public:
Ptr(T* t, int s = 1) : sz{s<1 ? throw std::logic_error("Invalid sz parameter") : s} {
sz = s;
p = new T[sz];
std::copy(t,t+sz,p);
}
Ptr(const Ptr& t) : Ptr(t.p, t.sz) { }
Ptr& operator=(Ptr copy) {
std::swap(copy.sz, sz);
std::swap(copy.p, p);
return *this;
}
Ptr(Ptr &&t) :p{t.p}, sz{t.sz} {
t.p = nullptr;
t.sz = 0;
}
Ptr& operator=(Ptr &&t) {
std::swap(t.p,p);
std::swap(t.sz,sz);
return *this;
}
T& operator*() {
check_range(index);
return p[index];
}
T& operator[](int i) {
check_range(i);
return p[i];
}
T* get() const {
return p;
}
void operator+=(int i) {
check_range(index+i);
index += i;
}
void operator-=(int i) {
operator+=(-i);
}
Ptr operator+(int i) {
Ptr old{*this};
old += index+i;
return old;
}
Ptr operator-(int i) {
return operator+(-i);
}
Ptr& operator++() {
operator+=(1);
return *this;
}
Ptr operator++(int) {
Ptr old{p+index};
operator++();
return old;
}
Ptr& operator--() {
operator-=(1);
return *this;
}
Ptr operator--(int) {
Ptr<T> old{p+index};
operator--();
return old;
}
~Ptr() {
delete[] p;
}
private:
T* p;
int sz;
int index = 0;
void check_range(int i) {
if (i < 0 || i > sz-1) {
throw std::out_of_range("out of range");
}
if (p+index == nullptr) {
throw std::out_of_range("null pointer");
}
}
};
template<typename T>
class Ptr {
public:
Ptr(T* t, int s = 1) : sz{s<1 ? throw std::logic_error("Invalid sz parameter") : s} {
sz = s;
p = new T[sz];
std::copy(t,t+sz,p);
}
Ptr(const Ptr& t) : Ptr(t.p, t.sz) { }
Ptr& operator=(Ptr copy) {
std::swap(copy.sz, sz);
std::swap(copy.p, p);
return *this;
}
Ptr(Ptr &&t) :p{t.p}, sz{t.sz} {
t.p = nullptr;
t.sz = 0;
}
Ptr& operator=(Ptr &&t) {
std::swap(t.p,p);
std::swap(t.sz,sz);
return *this;
}
T& operator*() {
check_range(index);
return p[index];
}
T& operator[](int i) {
check_range(i);
return p[i];
}
T* get() const {
return p;
}
void operator+=(int i) {
check_range(index+i);
index += i;
}
void operator-=(int i) {
operator+=(-i);
}
Ptr operator+(int i) {
Ptr old{*this};
old += index+i;
return old;
}
Ptr operator-(int i) {
return operator+(-i);
}
Ptr& operator++() {
operator+=(1);
return *this;
}
Ptr operator++(int) {
Ptr old{p+index};
operator++();
return old;
}
Ptr& operator--() {
operator-=(1);
return *this;
}
Ptr operator--(int) {
Ptr<T> old{p+index};
operator--();
return old;
}
~Ptr() {
delete[] p;
}
private:
T* p;
int sz;
int index = 0;
void check_range(int i) {
if (i < 0 || i > sz-1) {
throw std::out_of_range("out of range");
}
if (p+i == nullptr) {
throw std::out_of_range("null pointer");
}
}
};
Loading
Loading
lang-cpp