Ejemplo n.º 1
0
Number* Rational::acoss()
{
    Float* res = new Float;
    Float* tmp = SCAST_FLOAT(res->convert(this));
    if (fabs(tmp->number_)<=1.0)
    {
        res->number_=asin(tmp->number_);
        delete tmp;
        return res;
    }
    else if (tmp->number_>0)
    {
        complex<double> c_a(tmp->number_,0.0);
        complex<double> c_res = asin(c_a);
        Complex* res = new Complex;
        res->exact_ = false;
        res->real_ = new Float(::real(c_res));
        res->imag_ = new Float(::imag(c_res));
        delete tmp;
        return res;
    }
    else
    {
        complex<double> c_a(fabs(tmp->number_),0.0);
        complex<double> c_res = asin(c_a);
        Complex* res = new Complex;
        res->exact_ = false;
        res->real_ = new Float(::real(c_res)+PI);
        res->imag_ = new Float(0.0-::imag(c_res));
        delete tmp;
        return res;
    }
}
        void
        unHide()
        {
            // begin example "wns.ChamaeleonConstructor.example"
            // The Chamaeleon takes a pointer
            Chamaeleon<A*> a(new A);
            // end example

            CPPUNIT_ASSERT_EQUAL( 1, a.unHide()->test() );

            // begin example "wns.ChamaeleonUnHide.example"
            // Create three Chamaeleons
            Chamaeleon<B*> b(new B);
            Chamaeleon<C*> c(new C);
            Chamaeleon<A*> c_a(new C);

            // unHide the real objects
            B* bPtr = b.unHide();
            C* cPtr = c.unHide();
            A* c_aPtr = c_a.unHide();

            // Check if everything works
            CPPUNIT_ASSERT_EQUAL( 2, bPtr->test() );
            CPPUNIT_ASSERT_EQUAL( 3, cPtr->test() );
            CPPUNIT_ASSERT_EQUAL( 3, c_aPtr->test() );
            // end example

            delete a.unHide();
            delete bPtr;
            delete cPtr;
            delete c_aPtr;
        }