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; }