// -*- 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_)); } } }