Program Listing for File TIMUtilities.h

Return to documentation for file (src/VALfiles/TIMUtilities.h)

/************************************************************************
 * Copyright 2008, Strathclyde Planning Group,
 * Department of Computer and Information Sciences,
 * University of Strathclyde, Glasgow, UK
 * http://planning.cis.strath.ac.uk/
 *
 * Maria Fox, Richard Howey and Derek Long - VAL
 * Stephen Cresswell - PDDL Parser
 *
 * This file is part of VAL, the PDDL validator.
 *
 * VAL is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 2 of the License, or
 * (at your option) any later version.
 *
 * VAL 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 VAL.  If not, see <http://www.gnu.org/licenses/>.
 *
 ************************************************************************/

#ifndef __TIMUTILS
#define __TIMUTILS

#include <iostream>
#include <iterator>


using std::ostream;
using std::iterator;

namespace VAL {
class pddl_type;
};

template<class T>
struct ptrwriter
{
    ostream & os;
    const char * septr;

    ptrwriter(ostream & o,const char * sep) : os(o), septr(sep) {};
    void operator()(T * p)
    {
        os << (*p) << septr;
    };
};

namespace TIM {

template<class TI>
struct typeTransformer :
    public
#ifndef OLDCOMPILER
            std::iterator
#endif
#ifdef OLDCOMPILER
            std::forward_iterator
#endif
                    <typename std::iterator_traits<TI>::iterator_category,VAL::pddl_type *>{
    TI ti;
    int arg;
    const VAL::pddl_type * pt;
    int cnt;

    typeTransformer(TI t,int a,const VAL::pddl_type * p) :
        ti(t), arg(a), pt(p), cnt(0) {};

    VAL::pddl_type * operator*()
    {
        if(cnt==arg) return const_cast<VAL::pddl_type *>(pt);
        return (*ti)->type;
    };
    typeTransformer<TI> & operator++() {++ti; ++cnt; return *this;};
    bool operator==(const typeTransformer<TI> & t) const {return ti == t.ti;};
    size_t operator-(const typeTransformer<TI> & t) const
    {
        return ti - t.ti;
    };
};

template<class TI>
typeTransformer<TI> makeTT(TI t,int a,const VAL::pddl_type * p)
{
    return typeTransformer<TI>(t,a,p);
};

};

#endif