414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira/* This file is part of the libdepixelize project
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira Copyright (C) 2013 Vinícius dos Santos Oliveira <vini.ipsmaker@gmail.com>
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira GNU Lesser General Public License Usage
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira This library is free software; you can redistribute it and/or modify it
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira under the terms of the GNU Lesser General Public License as published by the
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira Free Software Foundation; either version 2.1 of the License, or (at your
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira option) any later version.
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira You should have received a copy of the GNU Lesser General Public License
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira along with this library. If not, see <http://www.gnu.org/licenses/>.
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira GNU General Public License Usage
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira Alternatively, this library may be used under the terms of the GNU General
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira Public License as published by the Free Software Foundation, either version
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira 2 of the License, or (at your option) any later version.
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira You should have received a copy of the GNU General Public License along with
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira this library. If not, see <http://www.gnu.org/licenses/>.
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira This library is distributed in the hope that it will be useful,
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira but WITHOUT ANY WARRANTY; without even the implied warranty of
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira Lesser General Public License for more details.
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira*/
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira#ifndef LIBDEPIXELIZE_TRACER_ITERATOR_H
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira#define LIBDEPIXELIZE_TRACER_ITERATOR_H
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira#include <vector>
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira#include <iterator>
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveiranamespace Tracer {
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveiratemplate<typename T>
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveiraconst T *to_ptr(typename std::vector<T>::const_iterator it)
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira{
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira return &*it;
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira}
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveiratemplate<typename T>
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos OliveiraT *to_ptr(typename std::vector<T>::iterator it)
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira{
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira return &*it;
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira}
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveiratemplate<typename T>
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveiratypename std::vector<T>::const_iterator to_iterator(T const *ptr,
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira typename std::vector<T>
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira ::const_iterator begin)
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira{
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira typedef typename std::vector<T>::const_iterator It;
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira typedef typename std::iterator_traits<It>::difference_type difference_type;
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira difference_type idx = ptr - to_ptr<T>(begin);
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira return begin + idx;
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira}
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveiratemplate<typename T>
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveiratypename std::vector<T>::iterator to_iterator(T *ptr,
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira typename std::vector<T>::iterator
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira begin)
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira{
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira typedef typename std::vector<T>::iterator It;
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira typedef typename std::iterator_traits<It>::difference_type difference_type;
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira difference_type idx = ptr - to_ptr<T>(begin);
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira return begin + idx;
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira}
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveiratemplate<typename T>
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveiraclass ToIter
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira{
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveirapublic:
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira typedef typename std::vector<T>::const_iterator const_iterator;
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira typedef typename std::vector<T>::iterator iterator;
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira ToIter(const_iterator begin) :
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira begin(begin)
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira {}
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira const_iterator operator()(T const *ptr) const
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira {
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira return to_iterator<T>(ptr, begin);
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira }
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira iterator operator()(T *ptr) const
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira {
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira return to_iterator<T>(ptr, begin);
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira }
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveiraprivate:
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira typename std::vector<T>::const_iterator begin;
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira};
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveiratemplate<typename T>
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveiraclass ToPtr
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira{
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveirapublic:
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira typedef typename std::vector<T>::const_iterator const_iterator;
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira typedef typename std::vector<T>::iterator iterator;
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira const T *operator()(const_iterator it) const
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira {
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira return to_ptr<T>(it);
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira }
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira T *operator()(iterator it) const
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira {
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira return to_ptr<T>(it);
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira }
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira};
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira} // namespace Tracer
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira#endif // LIBDEPIXELIZE_TRACER_ITERATOR_H
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira/*
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira Local Variables:
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira mode:c++
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira c-file-style:"stroustrup"
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira indent-tabs-mode:nil
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira fill-column:99
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira End:
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira*/
414668913fd00c6b9f194323ce3789c9b1454a3bVinícius dos Santos Oliveira// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :