#include "array.h"
#include <map>
#include <algorithm>
#include <functional>
#include "warning.h"
namespace blop
{
void array::replace(const var &from, const var &to)
{
for(unsigned int i=0; i<size(); ++i)
{
(*this)[i].replace(from,to);
}
}
class var_less_s : public std::binary_function<var,var,bool>
{
public:
bool operator()(const var &x, const var &y) const { return x.str()<y.str(); }
};
class var_less_n : public std::binary_function<var,var,bool>
{
public:
bool operator()(const var &x, const var &y) const { return x.dbl()<y.dbl(); }
};
void array::sort_s()
{
std::sort(begin(), end(), var_less_s());
}
void array::sort_n()
{
std::sort(begin(), end(), var_less_n());
}
var array::outfs_ = " ";
var array::infs_ = " ";
const var &array::outfs() { return outfs_; }
void array::outfs(const var &f) { outfs_ = f; }
const var &array::infs() { return infs_; }
void array::infs(const var &f) { infs_ = f; }
array::array() : iterator_(0) {}
array::array(const array &o) : std::vector<blop::var>(o), iterator_(o.iterator_) {}
array::array(unsigned int size) : std::vector<blop::var>(size) {}
void array::setfirst() { iterator_ = 0; }
void array::setlast() { iterator_ = size()-1; }
void array::set(int i) { iterator_ = i; }
int array::pos() const { return iterator_ ; }
array::operator bool () const {return 0<=iterator_ && iterator_<size();}
const array &array::operator++() {++iterator_; return *this;}
const array &array::operator--() {--iterator_; return *this;}
var &array::operator()()
{
if(0<=iterator_ && iterator_<size()) return (*this)[iterator_];
warning::print("Iterator is out of range","array::operator()");
static var dummy;
return dummy;
}
const var &array::operator()() const { return (*this)[iterator_]; }
const array &array::operator=(const array &rhs)
{
std::vector<blop::var>::operator=(rhs);
iterator_ = rhs.iterator_;
return rhs;
}
var array::pop_back()
{
var result = "";
if(!empty())
{
result = back();
resize(size()-1);
}
return result;
}
array &array::erase(unsigned int pos)
{
std::vector<blop::var>::erase(begin()+pos);
return *this;
}
array &array::push_back(const array &other)
{
int off = size();
resize(size() + other.size());
for(unsigned int i=0; i<other.size(); ++i)
{
(*this)[off+i] = other[i];
}
return *this;
}
void array::push_back(const var &v)
{
vector<var>::push_back(v);
}
array &array::operator() (const var &v)
{
vector<var>::push_back(v);
return *this;
}
void array::push_front(const var &v)
{
resize(size() + 1);
for(int i=size()-1; i>=1; --i)
{
(*this)[i] = (*this)[i-1];
}
(*this)[0] = v;
}
void array::push_front(const array &o)
{
int oldsize = size();
int newsize = oldsize + o.size();
resize(newsize);
for(int i=oldsize-1; i>=0; --i)
{
(*this)[i+o.size()] = (*this)[i];
}
for(unsigned int i=0; i<o.size(); ++i)
{
(*this)[i] = o[i];
}
}
array array::tmp_;
array &array::sequence(const var &step, const var &from, const var &to)
{
tmp_.clear();
for(var v = from; v.dbl() <= to.dbl(); v += step)
{
tmp_.push_back(v);
}
return tmp_;
}
array &array::make(const var &v)
{
tmp_.clear();
tmp_.push_back(v);
return tmp_;
}
array array_unique(const array &a)
{
std::map<std::string, bool> m;
for(unsigned int i=0; i<a.size(); ++i) m[a[i]] = true;
array result;
for(std::map<std::string,bool>::iterator i=m.begin();
i != m.end(); ++i)
{
result.push_back((*i).first);
}
return result;
}
}
std::ostream& operator<< (std::ostream &out, const blop::array &a)
{
for(unsigned int i=0; i<a.size(); ++i)
{
out<<a[i];
if(i < a.size()-1) out<<blop::array::outfs();
}
return out;
}