Variant f_filter_var(const Variant& variable, int64_t filter /* = 516 */, const Variant& options /* = empty_array_ref */) { int64_t filter_flags; if (options.isArray()) { filter_flags = options.toCArrRef()[s_flags].toInt64(); } else { filter_flags = options.toInt64(); } if (!(filter_flags & k_FILTER_REQUIRE_ARRAY || filter_flags & k_FILTER_FORCE_ARRAY)) { filter_flags |= k_FILTER_REQUIRE_SCALAR; } // No idea why, but zend does this.. if (filter == k_FILTER_CALLBACK) { filter_flags = 0; } if (variable.isArray()) { FAIL_IF(filter_flags & k_FILTER_REQUIRE_SCALAR); Variant ret; FAIL_IF(!filter_recursive(ret, variable, filter, options)); return ret; } FAIL_IF(filter_flags & k_FILTER_REQUIRE_ARRAY); Variant ret; FAIL_IF(!filter_var(ret, variable, filter, options)); if (filter_flags & k_FILTER_FORCE_ARRAY && !ret.isArray()) { ret = make_packed_array(ret); } return ret; }
CosNotifyFilter::Filter_ptr TAO_Notify_Tests_RT_Test_FilterFactory::create_filter (const char *constraint_grammar) { if (TAO_debug_level) ACE_DEBUG ((LM_DEBUG, "(%P, %t)In TAO_Notify_Tests_RT_Test_FilterFactory::create_filter\n")); // @@: change to "ExTCL" later. if (ACE_OS::strcmp (constraint_grammar, "TCL") != 0 && ACE_OS::strcmp (constraint_grammar, "ETCL") != 0 && ACE_OS::strcmp (constraint_grammar, "EXTENDED_TCL") != 0) throw CosNotifyFilter::InvalidGrammar (); // Create the RefCounted servant. TAO_Notify_Tests_RT_Test_Filter* filter = 0; ACE_NEW_THROW_EX (filter, TAO_Notify_Tests_RT_Test_Filter (), CORBA::NO_MEMORY ()); PortableServer::ServantBase_var filter_var (filter); PortableServer::ObjectId_var oid = this->filter_poa_->activate_object (filter); CORBA::Object_var obj = this->filter_poa_->id_to_reference (oid.in ()); return CosNotifyFilter::Filter::_narrow (obj.in ()); }
static bool filter_recursive(Variant& ret, const Variant& variable, int64_t filter, const Variant& options) { Array arr; for (ArrayIter iter(variable.toArray()); iter; ++iter) { Variant v; if (iter.second().isArray()) { FAIL_IF(!filter_recursive(v, iter.second().toArray(), filter, options)); } else { FAIL_IF(!filter_var(v, iter.second(), filter, options)); } arr.add(iter.first(), v); } ret = arr; return true; }