Program Listing for File SpinOrbitLockInfo.h

Return to documentation for file (/home/kpenev/projects/git/poet/poet_src/Evolve/SpinOrbitLockInfo.h)

#ifndef __SPIN_ORBIT_LOCK_INFO
#define __SPIN_ORBIT_LOCK_INFO

#include "../Core/SharedLibraryExportMacros.h"
#include <iostream>

namespace Evolve {

    //frequencies, not only when the orbital and spin periods are the same. In
    class LIB_LOCAL SpinOrbitLockInfo {
    private:
        int __orbital_freq_mult,

            __spin_freq_mult;

        short __lock_direction;

    public:
        SpinOrbitLockInfo(
                int orbital_freq_mult=0,

                int spin_freq_mult=0,

                short lock_direction=-1)
        {set_lock(orbital_freq_mult, spin_freq_mult, lock_direction);}

        SpinOrbitLockInfo(const SpinOrbitLockInfo &orig)
        {set_lock(orig.orbital_frequency_multiplier(),
                orig.spin_frequency_multiplier(),
                orig.lock_direction());}

        SpinOrbitLockInfo &operator=(const SpinOrbitLockInfo &rhs)
        {set_lock(rhs.orbital_frequency_multiplier(),
                rhs.spin_frequency_multiplier(),
                rhs.lock_direction()); return *this;}

        void set_lock(
                int orbital_freq_mult,

                int spin_freq_mult,

                short lock_direction=0);

        double spin(double orbital_frequency) const
        {return (orbital_frequency*__orbital_freq_mult)/__spin_freq_mult;}

        bool operator()(
                int orbital_freq_mult,

                int spin_freq_mult) const
        {return (__lock_direction ? false :
                 term(orbital_freq_mult, spin_freq_mult));}

        bool term(
                int orbital_freq_mult,

                int spin_freq_mult) const
        {return (orbital_freq_mult * __spin_freq_mult
                 ==
                 spin_freq_mult * __orbital_freq_mult);}

        operator bool() const {return __lock_direction==0;}

        short lock_direction() const {return __lock_direction;}

        void lock_direction(short value) {__lock_direction=value;}

        int orbital_frequency_multiplier() const {return __orbital_freq_mult;}

        int spin_frequency_multiplier() const {return __spin_freq_mult;}

        bool operator==(const SpinOrbitLockInfo &rhs) const;
    };//End SpinOrbitLockInfo class.

    LIB_LOCAL std::ostream &operator<<(std::ostream &os,
                                       const SpinOrbitLockInfo &lock);

} //End Evolve namespace.

#endif