MODULE = Ogre     PACKAGE = Ogre::Degree

Degree *
Degree::new(...)
  PREINIT:
    char *usage = "Usage: Ogre::Degree::new(CLASS [, d]) or new(CLASS, Radian)\n";
  CODE:
    // Degree()
    if (items == 1) {
        RETVAL = new Degree();
    }
    else if (items == 2) {
        // Degree(Real d)
        if (looks_like_number(ST(1))) {
            RETVAL = new Degree((Real)SvNV(ST(1)));
        }
        // Degree(const Radian &d)
        else if (sv_isobject(ST(1)) && sv_derived_from(ST(1), "Ogre::Radian")) {
            Radian *rad = (Radian *) SvIV((SV *) SvRV(ST(1)));   // TMOGRE_IN
            RETVAL = new Degree(*rad);
        }
    }
    else {
        croak("%s", usage);
    }
  OUTPUT:
    RETVAL

void
Degree::DESTROY()


# ==, !=, <, >, <=, >=
bool
deg_eq_xs(lobj, robj, swap)
    Degree * lobj
    Degree * robj
    IV        swap
  ALIAS:
    deg_ne_xs = 1
    deg_lt_xs = 2
    deg_gt_xs = 3
    deg_le_xs = 4
    deg_ge_xs = 5
  CODE:
    switch(ix) {
        case 0: RETVAL = (*lobj == *robj); break;
        case 1: RETVAL = (*lobj != *robj); break;
        case 2: RETVAL = (*lobj < *robj); break;
        case 3: RETVAL = (*lobj > *robj); break;
        case 4: RETVAL = (*lobj <= *robj); break;
        case 5: RETVAL = (*lobj >= *robj); break;
    }
  OUTPUT:
    RETVAL

# +, -  (still need others)
Degree *
deg_plus_xs(lobj, robj, swap)
    Degree * lobj
    Degree * robj
    IV        swap
  ALIAS:
    deg_minus_xs = 1
  PREINIT:
    Degree *deg = new Degree;
  CODE:
    switch(ix) {
        case 0: *deg = *lobj + *robj; break;
        case 1: *deg = swap ? (*robj - *lobj) : (*lobj - *robj); break;
    }
    RETVAL = deg;
  OUTPUT:
    RETVAL

# *
Degree *
deg_mult_xs(lobj, robj, swap)
    Degree * lobj
    SV * robj
    IV swap
  PREINIT:
    Degree *deg = new Degree;
  CODE:
    if (looks_like_number(robj)) {
        Real rhs = (Real)SvNV(robj);
        *deg = *lobj * rhs;
    }
    else if (sv_isobject(robj)) {
        DegRad * rhs;
        TMOGRE_DEGRAD_IN(robj, rhs, Ogre::Degree, deg_mult_xs);
        // note: no swap, b/c swapped returns Radian (and also it doesn't matter)
        *deg = *lobj * *rhs;
    }
    else {
        croak("Degree::deg_mult_xs: unknown argument!\n");
    }
    RETVAL = deg;
  OUTPUT:
    RETVAL

# neg
Degree *
deg_neg_xs(lobj, robj, swap)
    Degree * lobj
    SV * robj
    IV swap
  PREINIT:
    Degree *deg = new Degree;
  CODE:
    *deg = - (*lobj);
    RETVAL = deg;
  OUTPUT:
    RETVAL


Real
Degree::valueDegrees()

Real
Degree::valueRadians()

Real
Degree::valueAngleUnits()