uintx get_object_id(const Value& val) { if (!val.is_object()) { return reinterpret_cast<uintx>(val.value()); } else { return object_cast(val)->id() << 0x10; } }
template <typename D, typename S> inline typename std::enable_if<is_object<D>::value && is_interface_type<S>::value, D>::type cast(S s) { if (s == nullptr) { return nullptr; } return object_cast(s); }
// cast internals template <typename D, typename S> inline typename std::enable_if<is_class_type<D>::value && !is_object<D>::value && is_interface_type<S>::value, D>::type cast(S s) { if (s == nullptr) { return nullptr; } auto d = dynamic_cast<D>(object_cast(s)); if (d == nullptr) { throw __new<CoreLib::System::InvalidCastException>(); } return d; }
std::vector< sc_object* > const & sc_vector_base::get_elements() const { if( !objs_vec_ ) objs_vec_ = new std::vector< sc_object* >; if( objs_vec_->size() || !size() ) return *objs_vec_; objs_vec_->reserve( size() ); for( const_iterator it=begin(); it != end(); ++it ) if( sc_object* obj = object_cast(*it) ) objs_vec_->push_back( obj ); return *objs_vec_; }