|
From: Braden M. <br...@us...> - 2005-12-12 04:16:28
|
Update of /cvsroot/openvrml/openvrml/src/libopenvrml/openvrml In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv586/src/libopenvrml/openvrml Modified Files: browser.cpp field_value.cpp node.cpp script.cpp script.h Log Message: Replaced several instances of switching on field_value::type with boost::mpl::for_each. This consolidates several lists of the field_value types into one--openvrml_::field_value_types in private.h--and allows for more concise code. Index: browser.cpp =================================================================== RCS file: /cvsroot/openvrml/openvrml/src/libopenvrml/openvrml/browser.cpp,v retrieving revision 1.114 retrieving revision 1.115 diff -C2 -d -r1.114 -r1.115 *** browser.cpp 8 Dec 2005 06:50:13 -0000 1.114 --- browser.cpp 12 Dec 2005 04:16:18 -0000 1.115 *************** *** 37,40 **** --- 37,41 ---- # include <boost/bind.hpp> # include <boost/functional.hpp> + # include <boost/mpl/for_each.hpp> # include <boost/spirit.hpp> # include <boost/spirit/phoenix.hpp> *************** *** 198,210 **** }; [...1262 lines suppressed...] ! bool succeeded = eventout_is(map_entry->second->value().type(), ! eventout, ! *map_entry->second); ! assert(succeeded); } --- 5549,5561 ---- map_entry != this->eventout_map.end(); ++map_entry) { + using boost::mpl::for_each; + using openvrml_::field_value_types; + openvrml::event_emitter & eventout = this->proto_node_->event_emitter(map_entry->first); ! for_each<field_value_types>( ! eventout_is(map_entry->second->value().type(), ! eventout, ! *map_entry->second)); } Index: field_value.cpp =================================================================== RCS file: /cvsroot/openvrml/openvrml/src/libopenvrml/openvrml/field_value.cpp,v retrieving revision 1.21 retrieving revision 1.22 diff -C2 -d -r1.21 -r1.22 *** field_value.cpp 11 Dec 2005 04:23:28 -0000 1.21 --- field_value.cpp 12 Dec 2005 04:16:18 -0000 1.22 *************** *** 29,32 **** --- 29,33 ---- # include <boost/array.hpp> # include <private.h> + # include <boost/mpl/for_each.hpp> # include "field_value.h" # include "node.h" *************** *** 347,350 **** --- 348,374 ---- */ + namespace { + + struct OPENVRML_LOCAL create_field_value { + create_field_value(const openvrml::field_value::type_id type, + std::auto_ptr<openvrml::field_value> & fv): + type_(type), + field_value_(&fv) + {} + + template <typename T> + void operator()(T) const + { + if (T::field_value_type_id == this->type_) { + this->field_value_->reset(new T); + } + } + + private: + openvrml::field_value::type_id type_; + std::auto_ptr<openvrml::field_value> * field_value_; + }; + } + /** * @brief Create a default instance of the type specified by @p type. *************** *** 360,429 **** throw (std::bad_alloc) { ! using std::auto_ptr; ! switch (type) { ! case field_value::sfbool_id: ! return auto_ptr<field_value>(new sfbool); ! case field_value::sfcolor_id: ! return auto_ptr<field_value>(new sfcolor); ! case field_value::sfcolorrgba_id: ! return auto_ptr<field_value>(new sfcolorrgba); ! case field_value::sffloat_id: ! return auto_ptr<field_value>(new sffloat); ! case field_value::sfdouble_id: ! return auto_ptr<field_value>(new sfdouble); ! case field_value::sfimage_id: ! return auto_ptr<field_value>(new sfimage); ! case field_value::sfint32_id: ! return auto_ptr<field_value>(new sfint32); ! case field_value::sfnode_id: ! return auto_ptr<field_value>(new sfnode); ! case field_value::sfrotation_id: ! return auto_ptr<field_value>(new sfrotation); ! case field_value::sfstring_id: ! return auto_ptr<field_value>(new sfstring); ! case field_value::sftime_id: ! return auto_ptr<field_value>(new sftime); ! case field_value::sfvec2f_id: ! return auto_ptr<field_value>(new sfvec2f); ! case field_value::sfvec2d_id: ! return auto_ptr<field_value>(new sfvec2d); ! case field_value::sfvec3f_id: ! return auto_ptr<field_value>(new sfvec3f); ! case field_value::sfvec3d_id: ! return auto_ptr<field_value>(new sfvec3d); ! case field_value::mfbool_id: ! return auto_ptr<field_value>(new mfbool); ! case field_value::mfcolor_id: ! return auto_ptr<field_value>(new mfcolor); ! case field_value::mfcolorrgba_id: ! return auto_ptr<field_value>(new mfcolorrgba); ! case field_value::mffloat_id: ! return auto_ptr<field_value>(new mffloat); ! case field_value::mfdouble_id: ! return auto_ptr<field_value>(new mfdouble); ! case field_value::mfimage_id: ! return auto_ptr<field_value>(new mfimage); ! case field_value::mfint32_id: ! return auto_ptr<field_value>(new mfint32); ! case field_value::mfnode_id: ! return auto_ptr<field_value>(new mfnode); ! case field_value::mfrotation_id: ! return auto_ptr<field_value>(new mfrotation); ! case field_value::mfstring_id: ! return auto_ptr<field_value>(new mfstring); ! case field_value::mftime_id: ! return auto_ptr<field_value>(new mftime); ! case field_value::mfvec2f_id: ! return auto_ptr<field_value>(new mfvec2f); ! case field_value::mfvec2d_id: ! return auto_ptr<field_value>(new mfvec2d); ! case field_value::mfvec3f_id: ! return auto_ptr<field_value>(new mfvec3f); ! case field_value::mfvec3d_id: ! return auto_ptr<field_value>(new mfvec3d); ! default: ! assert(false); ! } ! return auto_ptr<field_value>(0); } --- 384,394 ---- throw (std::bad_alloc) { ! using boost::mpl::for_each; ! using openvrml_::field_value_types; ! ! std::auto_ptr<field_value> result; ! for_each<field_value_types>(create_field_value(type, result)); ! assert(result.get()); ! return result; } Index: node.cpp =================================================================== RCS file: /cvsroot/openvrml/openvrml/src/libopenvrml/openvrml/node.cpp,v retrieving revision 1.72 retrieving revision 1.73 diff -C2 -d -r1.72 -r1.73 *** node.cpp 11 Dec 2005 04:23:28 -0000 1.72 --- node.cpp 12 Dec 2005 04:16:18 -0000 1.73 *************** *** 30,33 **** --- 30,34 ---- # include <boost/bind.hpp> # include <boost/lexical_cast.hpp> + # include <boost/mpl/for_each.hpp> # include "private.h" # include "browser.h" *************** *** 2310,2313 **** --- 2311,2340 ---- namespace { + struct OPENVRML_LOCAL field_printer_ { + field_printer_(const openvrml::node & node, + openvrml::field_value::type_id type, + const std::string & interface_id, + std::ostream & out): + node_(&node), + type_(type), + interface_id_(&interface_id), + out_(&out) + {} + + template <typename T> + void operator()(T) const + { + if (T::field_value_type_id == this->type_) { + (*this->out_) << this->node_->field<T>(*this->interface_id_); + } + } + + private: + const openvrml::node * node_; + openvrml::field_value::type_id type_; + const std::string * interface_id_; + std::ostream * out_; + }; + const short indent_increment_ = 4; *************** *** 2326,2427 **** { using namespace openvrml; if (interface.type == node_interface::exposedfield_id || interface.type == node_interface::field_id) { this->out << std::string(this->indent + indent_increment_, ' ') << interface.id << ' '; ! switch (interface.field_type) { ! case field_value::sfbool_id: ! this->out << n.field<sfbool>(interface.id); ! break; ! case field_value::sfcolor_id: ! this->out << n.field<sfcolor>(interface.id); ! break; ! case field_value::sfcolorrgba_id: ! this->out << n.field<sfcolorrgba>(interface.id); ! break; ! case field_value::sfdouble_id: ! this->out << n.field<sfdouble>(interface.id); ! break; ! case field_value::sffloat_id: ! this->out << n.field<sffloat>(interface.id); ! break; ! case field_value::sfimage_id: ! this->out << n.field<sfimage>(interface.id); ! break; ! case field_value::sfint32_id: ! this->out << n.field<sfint32>(interface.id); ! break; ! case field_value::sfnode_id: ! this->out << n.field<sfnode>(interface.id); ! break; ! case field_value::sfrotation_id: ! this->out << n.field<sfrotation>(interface.id); ! break; ! case field_value::sfstring_id: ! this->out << n.field<sfstring>(interface.id); ! break; ! case field_value::sftime_id: ! this->out << n.field<sftime>(interface.id); ! break; ! case field_value::sfvec2f_id: ! this->out << n.field<sfvec2f>(interface.id); ! break; ! case field_value::sfvec2d_id: ! this->out << n.field<sfvec2d>(interface.id); ! break; ! case field_value::sfvec3f_id: ! this->out << n.field<sfvec3f>(interface.id); ! break; ! case field_value::sfvec3d_id: ! this->out << n.field<sfvec3d>(interface.id); ! break; ! case field_value::mfbool_id: ! this->out << n.field<mfbool>(interface.id); ! break; ! case field_value::mfcolor_id: ! this->out << n.field<mfcolor>(interface.id); ! break; ! case field_value::mfcolorrgba_id: ! this->out << n.field<mfcolorrgba>(interface.id); ! break; ! case field_value::mfdouble_id: ! this->out << n.field<mfdouble>(interface.id); ! break; ! case field_value::mffloat_id: ! this->out << n.field<mffloat>(interface.id); ! break; ! case field_value::mfimage_id: ! this->out << n.field<mfimage>(interface.id); ! break; ! case field_value::mfint32_id: ! this->out << n.field<mfint32>(interface.id); ! break; ! case field_value::mfnode_id: ! this->out << n.field<mfnode>(interface.id); ! break; ! case field_value::mfrotation_id: ! this->out << n.field<mfrotation>(interface.id); ! break; ! case field_value::mfstring_id: ! this->out << n.field<mfstring>(interface.id); ! break; ! case field_value::mftime_id: ! this->out << n.field<mftime>(interface.id); ! break; ! case field_value::mfvec2f_id: ! this->out << n.field<mfvec2f>(interface.id); ! break; ! case field_value::mfvec2d_id: ! this->out << n.field<mfvec2d>(interface.id); ! break; ! case field_value::mfvec3f_id: ! this->out << n.field<mfvec3f>(interface.id); ! break; ! case field_value::mfvec3d_id: ! this->out << n.field<mfvec3d>(interface.id); ! break; ! case field_value::invalid_type_id: ! assert(!"invalid field_value::type_id"); ! } } } --- 2353,2367 ---- { using namespace openvrml; + using boost::mpl::for_each; + using openvrml_::field_value_types; if (interface.type == node_interface::exposedfield_id || interface.type == node_interface::field_id) { this->out << std::string(this->indent + indent_increment_, ' ') << interface.id << ' '; ! for_each<field_value_types>( ! field_printer_(n, ! interface.field_type, ! interface.id, ! this->out)); } } *************** *** 2530,2543 **** namespace { ! template <typename FieldValue> ! OPENVRML_LOCAL bool add_listener(openvrml::event_emitter & emitter, ! openvrml::event_listener & listener) ! throw (std::bad_alloc, std::bad_cast) ! { ! using openvrml::field_value_emitter; ! using openvrml::field_value_listener; ! return dynamic_cast<field_value_emitter<FieldValue> &>(emitter) ! .add(dynamic_cast<field_value_listener<FieldValue> &>(listener)); ! } } --- 2470,2498 ---- namespace { ! struct OPENVRML_LOCAL add_listener { ! add_listener(openvrml::event_emitter & emitter, ! openvrml::event_listener & listener, ! bool & added_route): ! emitter_(&emitter), ! listener_(&listener), ! added_route_(&added_route) ! {} ! ! template <typename T> ! void operator()(T) const ! { ! if (T::field_value_type_id == this->emitter_->value().type()) { ! typedef openvrml::field_value_emitter<T> emitter_t; ! typedef openvrml::field_value_listener<T> listener_t; ! *this->added_route_ = ! dynamic_cast<emitter_t &>(*this->emitter_).add( ! dynamic_cast<listener_t &>(*this->listener_)); ! } ! } ! ! openvrml::event_emitter * emitter_; ! openvrml::event_listener * listener_; ! bool * added_route_; ! }; } *************** *** 2579,2676 **** bool added_route = false; try { ! switch (emitter.value().type()) { ! case field_value::sfbool_id: ! added_route = add_listener<sfbool>(emitter, listener); ! break; ! case field_value::sfcolor_id: ! added_route = add_listener<sfcolor>(emitter, listener); ! break; ! case field_value::sfcolorrgba_id: ! added_route = add_listener<sfcolorrgba>(emitter, listener); ! break; ! case field_value::sffloat_id: ! added_route = add_listener<sffloat>(emitter, listener); ! break; ! case field_value::sfdouble_id: ! added_route = add_listener<sfdouble>(emitter, listener); ! break; ! case field_value::sfimage_id: ! added_route = add_listener<sfimage>(emitter, listener); ! break; ! case field_value::sfint32_id: ! added_route = add_listener<sfint32>(emitter, listener); ! break; ! case field_value::sfnode_id: ! added_route = add_listener<sfnode>(emitter, listener); ! break; ! case field_value::sfrotation_id: ! added_route = add_listener<sfrotation>(emitter, listener); ! break; ! case field_value::sfstring_id: ! added_route = add_listener<sfstring>(emitter, listener); ! break; ! case field_value::sftime_id: ! added_route = add_listener<sftime>(emitter, listener); ! break; ! case field_value::sfvec2f_id: ! added_route = add_listener<sfvec2f>(emitter, listener); ! break; ! case field_value::sfvec2d_id: ! added_route = add_listener<sfvec2d>(emitter, listener); ! break; ! case field_value::sfvec3f_id: ! added_route = add_listener<sfvec3f>(emitter, listener); ! break; ! case field_value::sfvec3d_id: ! added_route = add_listener<sfvec3d>(emitter, listener); ! break; ! case field_value::mfbool_id: ! added_route = add_listener<mfbool>(emitter, listener); ! break; ! case field_value::mfcolor_id: ! added_route = add_listener<mfcolor>(emitter, listener); ! break; ! case field_value::mfcolorrgba_id: ! added_route = add_listener<mfcolorrgba>(emitter, listener); ! break; ! case field_value::mffloat_id: ! added_route = add_listener<mffloat>(emitter, listener); ! break; ! case field_value::mfdouble_id: ! added_route = add_listener<mfdouble>(emitter, listener); ! break; ! case field_value::mfimage_id: ! added_route = add_listener<mfimage>(emitter, listener); ! break; ! case field_value::mfint32_id: ! added_route = add_listener<mfint32>(emitter, listener); ! break; ! case field_value::mfnode_id: ! added_route = add_listener<mfnode>(emitter, listener); ! break; ! case field_value::mfrotation_id: ! added_route = add_listener<mfrotation>(emitter, listener); ! break; ! case field_value::mfstring_id: ! added_route = add_listener<mfstring>(emitter, listener); ! break; ! case field_value::mftime_id: ! added_route = add_listener<mftime>(emitter, listener); ! break; ! case field_value::mfvec2f_id: ! added_route = add_listener<mfvec2f>(emitter, listener); ! break; ! case field_value::mfvec2d_id: ! added_route = add_listener<mfvec2d>(emitter, listener); ! break; ! case field_value::mfvec3f_id: ! added_route = add_listener<mfvec3f>(emitter, listener); ! break; ! case field_value::mfvec3d_id: ! added_route = add_listener<mfvec3d>(emitter, listener); ! break; ! case field_value::invalid_type_id: ! assert(false); ! } } catch (const bad_cast &) { throw field_value_type_mismatch(); --- 2534,2542 ---- bool added_route = false; try { ! using boost::mpl::for_each; ! using openvrml_::field_value_types; ! for_each<field_value_types>(add_listener(emitter, ! listener, ! added_route)); } catch (const bad_cast &) { throw field_value_type_mismatch(); *************** *** 2680,2693 **** namespace { ! template <typename FieldValue> ! OPENVRML_LOCAL bool remove_listener(openvrml::event_emitter & emitter, ! openvrml::event_listener & listener) ! throw (std::bad_cast) ! { ! using openvrml::field_value_emitter; ! using openvrml::field_value_listener; ! return dynamic_cast<field_value_emitter<FieldValue> &>(emitter).remove( ! dynamic_cast<field_value_listener<FieldValue> &>(listener)); ! } } --- 2546,2574 ---- namespace { ! struct OPENVRML_LOCAL remove_listener { ! remove_listener(openvrml::event_emitter & emitter, ! openvrml::event_listener & listener, ! bool & deleted_route): ! emitter_(&emitter), ! listener_(&listener), ! deleted_route_(&deleted_route) ! {} ! ! template <typename T> ! void operator()(T) const ! { ! if (T::field_value_type_id == this->emitter_->value().type()) { ! typedef openvrml::field_value_emitter<T> emitter_t; ! typedef openvrml::field_value_listener<T> listener_t; ! *this->deleted_route_ = ! dynamic_cast<emitter_t &>(*this->emitter_).remove( ! dynamic_cast<listener_t &>(*this->listener_)); ! } ! } ! ! openvrml::event_emitter * emitter_; ! openvrml::event_listener * listener_; ! bool * deleted_route_; ! }; } *************** *** 2721,2822 **** event_emitter & emitter = from.event_emitter(eventout); event_listener & listener = to.event_listener(eventin); - bool deleted_route = false; - try { ! switch (emitter.value().type()) { ! case field_value::sfbool_id: ! deleted_route = remove_listener<sfbool>(emitter, listener); ! break; ! case field_value::sfcolor_id: ! deleted_route = remove_listener<sfcolor>(emitter, listener); ! break; ! case field_value::sfcolorrgba_id: ! deleted_route = remove_listener<sfcolorrgba>(emitter, listener); ! break; ! case field_value::sffloat_id: ! deleted_route = remove_listener<sffloat>(emitter, listener); ! break; ! case field_value::sfdouble_id: ! deleted_route = remove_listener<sfdouble>(emitter, listener); ! break; ! case field_value::sfimage_id: ! deleted_route = remove_listener<sfimage>(emitter, listener); ! break; ! case field_value::sfint32_id: ! deleted_route = remove_listener<sfint32>(emitter, listener); ! break; ! case field_value::sfnode_id: ! deleted_route = remove_listener<sfnode>(emitter, listener); ! break; ! case field_value::sfrotation_id: ! deleted_route = remove_listener<sfrotation>(emitter, listener); ! break; ! case field_value::sfstring_id: ! deleted_route = remove_listener<sfstring>(emitter, listener); ! break; ! case field_value::sftime_id: ! deleted_route = remove_listener<sftime>(emitter, listener); ! break; ! case field_value::sfvec2f_id: ! deleted_route = remove_listener<sfvec2f>(emitter, listener); ! break; ! case field_value::sfvec2d_id: ! deleted_route = remove_listener<sfvec2d>(emitter, listener); ! break; ! case field_value::sfvec3f_id: ! deleted_route = remove_listener<sfvec3f>(emitter, listener); ! break; ! case field_value::sfvec3d_id: ! deleted_route = remove_listener<sfvec3d>(emitter, listener); ! break; ! case field_value::mfbool_id: ! deleted_route = remove_listener<mfbool>(emitter, listener); ! break; ! case field_value::mfcolor_id: ! deleted_route = remove_listener<mfcolor>(emitter, listener); ! break; ! case field_value::mfcolorrgba_id: ! deleted_route = remove_listener<mfcolorrgba>(emitter, listener); ! break; ! case field_value::mffloat_id: ! deleted_route = remove_listener<mffloat>(emitter, listener); ! break; ! case field_value::mfdouble_id: ! deleted_route = remove_listener<mfdouble>(emitter, listener); ! break; ! case field_value::mfimage_id: ! deleted_route = remove_listener<mfimage>(emitter, listener); ! break; ! case field_value::mfint32_id: ! deleted_route = remove_listener<mfint32>(emitter, listener); ! break; ! case field_value::mfnode_id: ! deleted_route = remove_listener<mfnode>(emitter, listener); ! break; ! case field_value::mfrotation_id: ! deleted_route = remove_listener<mfrotation>(emitter, listener); ! break; ! case field_value::mfstring_id: ! deleted_route = remove_listener<mfstring>(emitter, listener); ! break; ! case field_value::mftime_id: ! deleted_route = remove_listener<mftime>(emitter, listener); ! break; ! case field_value::mfvec2f_id: ! deleted_route = remove_listener<mfvec2f>(emitter, listener); ! break; ! case field_value::mfvec2d_id: ! deleted_route = remove_listener<mfvec2d>(emitter, listener); ! break; ! case field_value::mfvec3f_id: ! deleted_route = remove_listener<mfvec3f>(emitter, listener); ! break; ! case field_value::mfvec3d_id: ! deleted_route = remove_listener<mfvec3d>(emitter, listener); ! break; ! case field_value::invalid_type_id: ! assert(false); ! } } catch (const bad_cast &) { // --- 2602,2612 ---- event_emitter & emitter = from.event_emitter(eventout); event_listener & listener = to.event_listener(eventin); bool deleted_route = false; try { ! using boost::mpl::for_each; ! using openvrml_::field_value_types; ! for_each<field_value_types>(remove_listener(emitter, ! listener, ! deleted_route)); } catch (const bad_cast &) { // Index: script.cpp =================================================================== RCS file: /cvsroot/openvrml/openvrml/src/libopenvrml/openvrml/script.cpp,v retrieving revision 1.60 retrieving revision 1.61 diff -C2 -d -r1.60 -r1.61 *** script.cpp 11 Dec 2005 04:23:28 -0000 1.60 --- script.cpp 12 Dec 2005 04:16:18 -0000 1.61 *************** *** 26,29 **** --- 26,30 ---- # include <boost/array.hpp> + # include <boost/mpl/for_each.hpp> # include <private.h> # include "browser.h" *************** *** 235,238 **** --- 236,268 ---- } + namespace { + struct OPENVRML_LOCAL direct_output_processor { + direct_output_processor(openvrml::event_listener & listener, + openvrml::field_value & value, + const double timestamp): + listener_(&listener), + value_(&value), + timestamp_(timestamp) + {} + + template <typename T> + void operator()(T) const + { + if (T::field_value_type_id == this->listener_->type()) { + using boost::polymorphic_downcast; + using openvrml::field_value_listener; + dynamic_cast<field_value_listener<T> &>(*this->listener_) + .process_event(*polymorphic_downcast<T *>(this->value_), + this->timestamp_); + } + } + + private: + openvrml::event_listener * listener_; + openvrml::field_value * value_; + double timestamp_; + }; + } + /** * @internal *************** *** 251,409 **** output != this->direct_output_map_.end(); ++output) { ! using boost::polymorphic_downcast; ! switch (output->first->type()) { ! case field_value::sfbool_id: ! dynamic_cast<sfbool_listener &>(*output->first) ! .process_event(*polymorphic_downcast<sfbool *>( ! output->second.get()), timestamp); ! break; ! case field_value::sfcolor_id: ! dynamic_cast<sfcolor_listener &>(*output->first) ! .process_event(*polymorphic_downcast<sfcolor *>( ! output->second.get()), timestamp); ! break; ! case field_value::sfcolorrgba_id: ! dynamic_cast<sfcolorrgba_listener &>(*output->first) ! .process_event(*polymorphic_downcast<sfcolorrgba *>( ! output->second.get()), timestamp); ! break; ! case field_value::sffloat_id: ! dynamic_cast<sffloat_listener &>(*output->first) ! .process_event(*polymorphic_downcast<sffloat *>( ! output->second.get()), timestamp); ! break; ! case field_value::sfdouble_id: ! dynamic_cast<sfdouble_listener &>(*output->first) ! .process_event(*polymorphic_downcast<sfdouble *>( ! output->second.get()), timestamp); ! break; ! case field_value::sfimage_id: ! dynamic_cast<sfimage_listener &>(*output->first) ! .process_event(*polymorphic_downcast<sfimage *>( ! output->second.get()), timestamp); ! break; ! case field_value::sfint32_id: ! dynamic_cast<sfint32_listener &>(*output->first) ! .process_event(*polymorphic_downcast<sfint32 *>( ! output->second.get()), timestamp); ! break; ! case field_value::sfnode_id: ! dynamic_cast<sfnode_listener &>(*output->first) ! .process_event(*polymorphic_downcast<sfnode *>( ! output->second.get()), timestamp); ! break; ! case field_value::sfrotation_id: ! dynamic_cast<sfrotation_listener &>(*output->first) ! .process_event(*polymorphic_downcast<sfrotation *>( ! output->second.get()), timestamp); ! break; ! case field_value::sfstring_id: ! dynamic_cast<sfstring_listener &>(*output->first) ! .process_event(*polymorphic_downcast<sfstring *>( ! output->second.get()), timestamp); ! break; ! case field_value::sftime_id: ! dynamic_cast<sftime_listener &>(*output->first) ! .process_event(*polymorphic_downcast<sftime *>( ! output->second.get()), timestamp); ! break; ! case field_value::sfvec2f_id: ! dynamic_cast<sfvec2f_listener &>(*output->first) ! .process_event(*polymorphic_downcast<sfvec2f *>( ! output->second.get()), timestamp); ! break; ! case field_value::sfvec2d_id: ! dynamic_cast<sfvec2d_listener &>(*output->first) ! .process_event(*polymorphic_downcast<sfvec2d *>( ! output->second.get()), timestamp); ! break; ! case field_value::sfvec3f_id: ! dynamic_cast<sfvec3f_listener &>(*output->first) ! .process_event(*polymorphic_downcast<sfvec3f *>( ! output->second.get()), timestamp); ! break; ! case field_value::sfvec3d_id: ! dynamic_cast<sfvec3d_listener &>(*output->first) ! .process_event(*polymorphic_downcast<sfvec3d *>( ! output->second.get()), timestamp); ! break; ! case field_value::mfbool_id: ! dynamic_cast<mfbool_listener &>(*output->first) ! .process_event(*polymorphic_downcast<mfbool *>( ! output->second.get()), timestamp); ! break; ! case field_value::mfcolor_id: ! dynamic_cast<mfcolor_listener &>(*output->first) ! .process_event(*polymorphic_downcast<mfcolor *>( ! output->second.get()), timestamp); ! break; ! case field_value::mfcolorrgba_id: ! dynamic_cast<mfcolorrgba_listener &>(*output->first) ! .process_event(*polymorphic_downcast<mfcolorrgba *>( ! output->second.get()), timestamp); ! break; ! case field_value::mffloat_id: ! dynamic_cast<mffloat_listener &>(*output->first) ! .process_event(*polymorphic_downcast<mffloat *>( ! output->second.get()), timestamp); ! break; ! case field_value::mfdouble_id: ! dynamic_cast<mfdouble_listener &>(*output->first) ! .process_event(*polymorphic_downcast<mfdouble *>( ! output->second.get()), timestamp); ! break; ! case field_value::mfimage_id: ! dynamic_cast<mfimage_listener &>(*output->first) ! .process_event(*polymorphic_downcast<mfimage *>( ! output->second.get()), timestamp); ! break; ! case field_value::mfint32_id: ! dynamic_cast<mfint32_listener &>(*output->first) ! .process_event(*polymorphic_downcast<mfint32 *>( ! output->second.get()), timestamp); ! break; ! case field_value::mfnode_id: ! dynamic_cast<mfnode_listener &>(*output->first) ! .process_event(*polymorphic_downcast<mfnode *>( ! output->second.get()), timestamp); ! break; ! case field_value::mfrotation_id: ! dynamic_cast<mfrotation_listener &>(*output->first) ! .process_event(*polymorphic_downcast<mfrotation *>( ! output->second.get()), timestamp); ! break; ! case field_value::mfstring_id: ! dynamic_cast<mfstring_listener &>(*output->first) ! .process_event(*polymorphic_downcast<mfstring *>( ! output->second.get()), timestamp); ! break; ! case field_value::mftime_id: ! dynamic_cast<mftime_listener &>(*output->first) ! .process_event(*polymorphic_downcast<mftime *>( ! output->second.get()), timestamp); ! break; ! case field_value::mfvec2f_id: ! dynamic_cast<mfvec2f_listener &>(*output->first) ! .process_event(*polymorphic_downcast<mfvec2f *>( ! output->second.get()), timestamp); ! break; ! case field_value::mfvec2d_id: ! dynamic_cast<mfvec2d_listener &>(*output->first) ! .process_event(*polymorphic_downcast<mfvec2d *>( ! output->second.get()), timestamp); ! break; ! case field_value::mfvec3f_id: ! dynamic_cast<mfvec3f_listener &>(*output->first) ! .process_event(*polymorphic_downcast<mfvec3f *>( ! output->second.get()), timestamp); ! break; ! case field_value::mfvec3d_id: ! dynamic_cast<mfvec3d_listener &>(*output->first) ! .process_event(*polymorphic_downcast<mfvec3d *>( ! output->second.get()), timestamp); ! break; ! case field_value::invalid_type_id: ! assert(false); ! } } this->direct_output_map_.clear(); --- 281,289 ---- output != this->direct_output_map_.end(); ++output) { ! using boost::mpl::for_each; ! using openvrml_::field_value_types; ! for_each<field_value_types>(direct_output_processor(*output->first, ! *output->second, ! timestamp)); } this->direct_output_map_.clear(); *************** *** 1071,1169 **** throw (std::bad_alloc) { boost::shared_ptr<openvrml::event_listener> listener; ! switch (type) { ! case field_value::sfbool_id: ! listener.reset(new sfbool_listener(id, node)); ! break; ! case field_value::sfcolor_id: ! listener.reset(new sfcolor_listener(id, node)); ! break; ! case field_value::sfcolorrgba_id: ! listener.reset(new sfcolorrgba_listener(id, node)); ! break; ! case field_value::sffloat_id: ! listener.reset(new sffloat_listener(id, node)); ! break; ! case field_value::sfdouble_id: ! listener.reset(new sfdouble_listener(id, node)); ! break; ! case field_value::sfimage_id: ! listener.reset(new sfimage_listener(id, node)); ! break; ! case field_value::sfint32_id: ! listener.reset(new sfint32_listener(id, node)); ! break; ! case field_value::sfnode_id: ! listener.reset(new sfnode_listener(id, node)); ! break; ! case field_value::sfstring_id: ! listener.reset(new sfstring_listener(id, node)); ! break; ! case field_value::sfrotation_id: ! listener.reset(new sfrotation_listener(id, node)); ! break; ! case field_value::sftime_id: ! listener.reset(new sftime_listener(id, node)); ! break; ! case field_value::sfvec2f_id: ! listener.reset(new sfvec2f_listener(id, node)); ! break; ! case field_value::sfvec2d_id: ! listener.reset(new sfvec2d_listener(id, node)); ! break; ! case field_value::sfvec3f_id: ! listener.reset(new sfvec3f_listener(id, node)); ! break; ! case field_value::sfvec3d_id: ! listener.reset(new sfvec3d_listener(id, node)); ! break; ! case field_value::mfbool_id: ! listener.reset(new mfbool_listener(id, node)); ! break; ! case field_value::mfcolor_id: ! listener.reset(new mfcolor_listener(id, node)); ! break; ! case field_value::mfcolorrgba_id: ! listener.reset(new mfcolorrgba_listener(id, node)); ! break; ! case field_value::mffloat_id: ! listener.reset(new mffloat_listener(id, node)); ! break; ! case field_value::mfdouble_id: ! listener.reset(new mfdouble_listener(id, node)); ! break; ! case field_value::mfimage_id: ! listener.reset(new mfimage_listener(id, node)); ! break; ! case field_value::mfint32_id: ! listener.reset(new mfint32_listener(id, node)); ! break; ! case field_value::mfnode_id: ! listener.reset(new mfnode_listener(id, node)); ! break; ! case field_value::mfstring_id: ! listener.reset(new mfstring_listener(id, node)); ! break; ! case field_value::mfrotation_id: ! listener.reset(new mfrotation_listener(id, node)); ! break; ! case field_value::mftime_id: ! listener.reset(new mftime_listener(id, node)); ! break; ! case field_value::mfvec2f_id: ! listener.reset(new mfvec2f_listener(id, node)); ! break; ! case field_value::mfvec2d_id: ! listener.reset(new mfvec2d_listener(id, node)); ! break; ! case field_value::mfvec3f_id: ! listener.reset(new mfvec3f_listener(id, node)); ! break; ! case field_value::mfvec3d_id: ! listener.reset(new mfvec3d_listener(id, node)); ! break; ! default: ! assert(false); ! } return listener; } --- 951,960 ---- throw (std::bad_alloc) { + using boost::mpl::for_each; + using openvrml_::field_value_types; boost::shared_ptr<openvrml::event_listener> listener; ! for_each<field_value_types>( ! script_event_listener_creator(type, id, node, listener)); ! assert(listener); return listener; } *************** *** 1186,1347 **** throw (std::bad_alloc) { ! using namespace openvrml; ! using boost::polymorphic_downcast; ! std::auto_ptr<openvrml::event_emitter> emitter; ! switch (value.type()) { ! case field_value::sfbool_id: ! emitter.reset(new script_event_emitter<sfbool>( ! node, ! *polymorphic_downcast<const sfbool *>(&value))); ! break; ! case field_value::sfcolor_id: ! emitter.reset(new script_event_emitter<sfcolor>( ! node, ! *polymorphic_downcast<const sfcolor *>(&value))); ! break; ! case field_value::sfcolorrgba_id: ! emitter.reset(new script_event_emitter<sfcolorrgba>( ! node, ! *polymorphic_downcast<const sfcolorrgba *>(&value))); ! break; ! case field_value::sffloat_id: ! emitter.reset(new script_event_emitter<sffloat>( ! node, ! *polymorphic_downcast<const sffloat *>(&value))); ! break; ! case field_value::sfdouble_id: ! emitter.reset(new script_event_emitter<sfdouble>( ! node, ! *polymorphic_downcast<const sfdouble *>(&value))); ! break; ! case field_value::sfimage_id: ! emitter.reset(new script_event_emitter<sfimage>( ! node, ! *polymorphic_downcast<const sfimage *>(&value))); ! break; ! case field_value::sfint32_id: ! emitter.reset(new script_event_emitter<sfint32>( ! node, ! *polymorphic_downcast<const sfint32 *>(&value))); ! break; ! case field_value::sfnode_id: ! emitter.reset(new script_event_emitter<sfnode>( ! node, ! *polymorphic_downcast<const sfnode *>(&value))); ! break; ! case field_value::sfstring_id: ! emitter.reset(new script_event_emitter<sfstring>( ! node, ! *polymorphic_downcast<const sfstring *>(&value))); ! break; ! case field_value::sfrotation_id: ! emitter.reset(new script_event_emitter<sfrotation>( ! node, ! *polymorphic_downcast<const sfrotation *>(&value))); ! break; ! case field_value::sftime_id: ! emitter.reset(new script_event_emitter<sftime>( ! node, ! *polymorphic_downcast<const sftime *>(&value))); ! break; ! case field_value::sfvec2f_id: ! emitter.reset(new script_event_emitter<sfvec2f>( ! node, ! *polymorphic_downcast<const sfvec2f *>(&value))); ! break; ! case field_value::sfvec2d_id: ! emitter.reset(new script_event_emitter<sfvec2d>( ! node, ! *polymorphic_downcast<const sfvec2d *>(&value))); ! break; ! case field_value::sfvec3f_id: ! emitter.reset(new script_event_emitter<sfvec3f>( ! node, ! *polymorphic_downcast<const sfvec3f *>(&value))); ! break; ! case field_value::sfvec3d_id: ! emitter.reset(new script_event_emitter<sfvec3d>( ! node, ! *polymorphic_downcast<const sfvec3d *>(&value))); ! break; ! case field_value::mfbool_id: ! emitter.reset(new script_event_emitter<mfbool>( ! node, ! *polymorphic_downcast<const mfbool *>(&value))); ! break; ! case field_value::mfcolor_id: ! emitter.reset(new script_event_emitter<mfcolor>( ! node, ! *polymorphic_downcast<const mfcolor *>(&value))); ! break; ! case field_value::mfcolorrgba_id: ! emitter.reset(new script_event_emitter<mfcolorrgba>( ! node, ! *polymorphic_downcast<const mfcolorrgba *>(&value))); ! break; ! case field_value::mffloat_id: ! emitter.reset(new script_event_emitter<mffloat>( ! node, ! *polymorphic_downcast<const mffloat *>(&value))); ! break; ! case field_value::mfdouble_id: ! emitter.reset(new script_event_emitter<mfdouble>( ! node, ! *polymorphic_downcast<const mfdouble *>(&value))); ! break; ! case field_value::mfimage_id: ! emitter.reset(new script_event_emitter<mfimage>( ! node, ! *polymorphic_downcast<const mfimage *>(&value))); ! break; ! case field_value::mfint32_id: ! emitter.reset(new script_event_emitter<mfint32>( ! node, ! *polymorphic_downcast<const mfint32 *>(&value))); ! break; ! case field_value::mfnode_id: ! emitter.reset(new script_event_emitter<mfnode>( ! node, ! *polymorphic_downcast<const mfnode *>(&value))); ! break; ! case field_value::mfstring_id: ! emitter.reset(new script_event_emitter<mfstring>( ! node, ! *polymorphic_downcast<const mfstring *>(&value))); ! break; ! case field_value::mfrotation_id: ! emitter.reset(new script_event_emitter<mfrotation>( ! node, ! *polymorphic_downcast<const mfrotation *>(&value))); ! break; ! case field_value::mftime_id: ! emitter.reset(new script_event_emitter<mftime>( ! node, ! *polymorphic_downcast<const mftime *>(&value))); ! break; ! case field_value::mfvec2f_id: ! emitter.reset(new script_event_emitter<mfvec2f>( ! node, ! *polymorphic_downcast<const mfvec2f *>(&value))); ! break; ! case field_value::mfvec2d_id: ! emitter.reset(new script_event_emitter<mfvec2d>( ! node, ! *polymorphic_downcast<const mfvec2d *>(&value))); ! break; ! case field_value::mfvec3f_id: ! emitter.reset(new script_event_emitter<mfvec3f>( ! node, ! *polymorphic_downcast<const mfvec3f *>(&value))); ! break; ! case field_value::mfvec3d_id: ! emitter.reset(new script_event_emitter<mfvec3d>( ! node, ! *polymorphic_downcast<const mfvec3d *>(&value))); ! break; ! default: ! assert(false); ! } return emitter; } --- 977,986 ---- throw (std::bad_alloc) { ! using boost::mpl::for_each; ! using openvrml_::field_value_types; std::auto_ptr<openvrml::event_emitter> emitter; ! for_each<field_value_types>( ! script_event_emitter_creator(node, value, emitter)); ! assert(emitter.get()); return emitter; } Index: script.h =================================================================== RCS file: /cvsroot/openvrml/openvrml/src/libopenvrml/openvrml/script.h,v retrieving revision 1.24 retrieving revision 1.25 diff -C2 -d -r1.24 -r1.25 *** script.h 8 Dec 2005 06:50:14 -0000 1.24 --- script.h 12 Dec 2005 04:16:18 -0000 1.25 *************** *** 183,186 **** --- 183,215 ---- typedef script_event_listener<mfvec3d> mfvec3d_listener; + struct OPENVRML_LOCAL script_event_listener_creator { + script_event_listener_creator( + const field_value::type_id type, + const std::string & id, + script_node & node, + boost::shared_ptr<openvrml::event_listener> & listener): + type_(type), + id_(&id), + node_(&node), + listener_(&listener) + {} + + template <typename T> + void operator()(T) const + { + if (T::field_value_type_id == this->type_) { + this->listener_->reset( + new script_event_listener<T>(*this->id_, + *this->node_)); + } + } + + private: + field_value::type_id type_; + const std::string * id_; + script_node * node_; + boost::shared_ptr<openvrml::event_listener> * listener_; + }; + static const boost::shared_ptr<openvrml::event_listener> create_listener(field_value::type_id type, const std::string & id, *************** *** 223,226 **** --- 252,283 ---- }; + struct OPENVRML_LOCAL script_event_emitter_creator { + script_event_emitter_creator( + script_node & node, + const openvrml::field_value & value, + std::auto_ptr<openvrml::event_emitter> & emitter): + node_(&node), + value_(&value), + emitter_(&emitter) + {} + + template <typename T> + void operator()(T) const + { + if (T::field_value_type_id == this->value_->type()) { + using boost::polymorphic_downcast; + this->emitter_->reset( + new script_event_emitter<T>( + *this->node_, + *polymorphic_downcast<const T *>(this->value_))); + } + } + + private: + script_node * node_; + const openvrml::field_value * value_; + std::auto_ptr<openvrml::event_emitter> * emitter_; + }; + static std::auto_ptr<openvrml::event_emitter> create_emitter(script_node & node, const field_value & value) |