/* emacs edit mode for this file is -*- C++ -*- */

#ifndef INCL_CF_ITER_H
#define INCL_CF_ITER_H

#include <config.h>

#include "canonicalform.h"

/*BEGINPUBLIC*/

#undef CF_INLINE
#define CF_INLINE
#undef CF_NO_INLINE
#define CF_NO_INLINE

/*ENDPUBLIC*/

#ifdef CF_USE_INLINE
#undef CF_INLINE
#define CF_INLINE inline
#else
#undef CF_INLINE
#define CF_INLINE
#endif

/*BEGINPUBLIC*/

class term;
typedef term * termList;

class CFIterator {
private:
    CanonicalForm data;
    termList cursor;
    bool ispoly, hasterms;
public:
    CFIterator ();
    CFIterator ( const CFIterator& );
    CFIterator ( const CanonicalForm& );
    CFIterator ( const CanonicalForm&, const Variable& );

    ~CFIterator ();

    CFIterator& operator= ( const CFIterator& );
    CFIterator& operator= ( const CanonicalForm& );

    CF_NO_INLINE CFIterator& operator++ ();
    CF_NO_INLINE CFIterator& operator++ ( int );
    CF_NO_INLINE int hasTerms () const;
    CF_NO_INLINE CanonicalForm coeff () const;
    CF_NO_INLINE int exp () const;
};

/*ENDPUBLIC*/

#ifdef CF_USE_INLINE
#include "cf_iter_inline.cc"
#endif

#endif /* ! INCL_CF_ITER_H */
