//
// This file contains code generated by Pyxie - http://www.sparkslabs.com/pyxie
//
// This file contains parts of code derived from Pyxie itself. It may be used
// under the following terms:
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the "Software"),
// to deal in the Software without restriction, including without limitation
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
// and/or sell copies of the Software, and to permit persons to whom the Software
// is furnished to do so, subject to the following conditions:
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// For more information see: http://www.sparkslabs.com/pyxie/COPYING.output.md
//

#ifndef PYXIE_ITERATORS_HPP
#define PYXIE_ITERATORS_HPP

/*
 * Python Style Iterators in C++, based in part on experiment work in Kamaelia
 * Redone to remove use of generators, so that this can be used on Arduino
 * 
 */

#define GENERATOR_START if (this->__generator_state == -1) { return __default_value; } switch(this->__generator_state) { default:
#define YIELD(value)    this->__generator_state = __LINE__; return ((value) );   case __LINE__:
#define GENERATOR_END    }; this->__generator_state = -1; return __default_value;

template<class T>
struct Iterator {
    virtual T next()=0;
    virtual bool completed()=0;
};

template<class T>
class Generator : public Iterator<T> {
  protected:
    int __generator_state;
  public:
    T __default_value;
    Generator() : __default_value(T()) {     };
    ~Generator() {     };
    virtual bool completed() { return __generator_state==-1; };
};

#endif
