int lo_coerce(lo_type type_to, lo_arg * to, lo_type type_from, lo_arg * from) { if (type_to == type_from) { memcpy(to, from, lo_arg_size(type_from, from)); return 1; } if (lo_is_string_type(type_to) && lo_is_string_type(type_from)) { strcpy((char *) to, (char *) from); return 1; } if (lo_is_numerical_type(type_to) && lo_is_numerical_type(type_from)) { switch (type_to) { case LO_INT32: to->i = (uint32_t) lo_hires_val(type_from, from); break; case LO_INT64: to->i64 = (uint64_t) lo_hires_val(type_from, from); break; case LO_FLOAT: to->f = (float) lo_hires_val(type_from, from); break; case LO_DOUBLE: to->d = (double) lo_hires_val(type_from, from); break; default: fprintf(stderr, "liblo: bad coercion: %c -> %c\n", type_from, type_to); return 0; } return 1; } return 0; }
// ***************************************************************************** void ReferencedStateSet::debug() { lo_arg **args; int argc; char *argTypes; std::cout << "****************************************" << std::endl; std::cout << "************* STATE DEBUG: *************" << std::endl; std::cout << "\nReferencedStateSet: " << id->s_name << ", type: " << classType << std::endl; std::cout << " Shared by:"; for (unsigned i = 0; i < getNumParents(); i++) std::cout << " " << getParent(i)->getName(); std::cout << std::endl; //osg::ref_ptr<ReferencedStateSet> test = this; //std::cout << "ref_count=" << test->getReferenceCount() << std::endl; vector<lo_message> nodeState = this->getState(); vector<lo_message>::iterator nodeStateIterator; for (nodeStateIterator = nodeState.begin(); nodeStateIterator != nodeState.end(); ++nodeStateIterator) { argTypes = lo_message_get_types(*nodeStateIterator); argc = lo_message_get_argc(*nodeStateIterator); args = lo_message_get_argv(*nodeStateIterator); std::cout << " "; for (int i = 0; i < argc; i++) { std::cout << " "; if (lo_is_numerical_type((lo_type)argTypes[i])) { std::cout << (float) lo_hires_val( (lo_type)argTypes[i], args[i] ); } else if (strlen((char*) args[i])) { std::cout << (char*) args[i]; } else { std::cout << "NULL"; } } std::cout << std::endl; } BROADCAST(this, "s", "debug"); }
static int lo_can_coerce(char a, char b) { return ((a == b) || (lo_is_numerical_type(a) && lo_is_numerical_type(b)) || (lo_is_string_type(a) && lo_is_string_type (b))); }