// -*- Mode: C++; indent-tabs-mode: nil; tab-width: 2 -*-
/*
* Copyright (C) 2012 Canonical Ltd
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*
* Authored by: Gordon Allott
*/
namespace unity
{
namespace dash
{
template
ModelIterator::ModelIterator(glib::Object model)
: model_(model)
, iter_(model ? dee_model_get_first_iter(model) : NULL)
, tag_(NULL)
, iter_result_(model_, iter_, tag_)
{
}
template
ModelIterator::ModelIterator(glib::Object model, DeeModelIter* iter, DeeModelTag* tag)
: model_(model)
, iter_(iter)
, tag_(tag)
, iter_result_(model_, iter_, tag_)
{
}
template
ModelIterator ModelIterator::operator[](int value)
{
return ModelIterator(model_, dee_model_get_iter_at_row(model_, value), tag_);
}
template
ModelIterator& ModelIterator::operator=(ModelIterator const& rhs)
{
model_ = rhs.model_;
iter_ = rhs.iter_;
tag_ = rhs.tag_;
iter_result_.SetTarget(model_, iter_, tag_);
return *this;
}
template
ModelIterator& ModelIterator::operator++()
{
iter_ = dee_model_next(model_, iter_);
return *this;
}
template
ModelIterator& ModelIterator::operator+=(int count)
{
if (dee_model_is_last(model_, iter_))
return *this;
for (int index = 0; index < count; index++)
iter_ = dee_model_next(model_, iter_);
return *this;
}
template
ModelIterator ModelIterator::operator++(int)
{
ModelIterator tmp(*this);
operator++();
return tmp;
}
template
ModelIterator ModelIterator::operator+(int count) const
{
ModelIterator tmp(*this);
tmp += count;
return tmp;
}
template
ModelIterator& ModelIterator::operator--()
{
iter_ = dee_model_prev(model_, iter_);
return *this;
}
template
ModelIterator& ModelIterator::operator-=(int count)
{
if (dee_model_is_first(model_, iter_))
return *this;
for (int index = 0; index < count; index++)
iter_ = dee_model_prev(model_, iter_);
return *this;
}
template
ModelIterator ModelIterator::operator--(int)
{
ModelIterator tmp(*this);
operator--();
return tmp;
}
template
ModelIterator ModelIterator::operator-(int count) const
{
ModelIterator tmp(*this);
tmp -= count;
return tmp;
}
template
Adaptor& ModelIterator::operator*()
{
iter_result_.SetTarget(model_, iter_, tag_);
return iter_result_;
}
template
bool ModelIterator::IsLast()
{
if (!model_) return true;
return (dee_model_is_last(model_, iter_));
}
template
bool ModelIterator::IsFirst()
{
if (!model_) return true;
return (dee_model_is_first(model_, iter_));
}
}
}