📄 nsisupportsimpl.h
字号:
/** * This implements query interface with two assumptions: First, the * class in question implements nsISupports and its own interface and * nothing else. Second, the implementation of the class's primary * inheritance chain leads to its own interface. * * @param _class The name of the class implementing the method * @param _classiiddef The name of the #define symbol that defines the IID * for the class (e.g. NS_ISUPPORTS_IID) */#define NS_IMPL_QUERY_HEAD(_class) \NS_IMETHODIMP _class::QueryInterface(REFNSIID aIID, void** aInstancePtr) \{ \ NS_ASSERTION(aInstancePtr, \ "QueryInterface requires a non-NULL destination!"); \ nsISupports* foundInterface;#define NS_IMPL_QUERY_BODY(_interface) \ if ( aIID.Equals(NS_GET_IID(_interface)) ) \ foundInterface = NS_STATIC_CAST(_interface*, this); \ else#define NS_IMPL_QUERY_BODY_CONDITIONAL(_interface, condition) \ if ( (condition) && aIID.Equals(NS_GET_IID(_interface))) \ foundInterface = NS_STATIC_CAST(_interface*, this); \ else#define NS_IMPL_QUERY_BODY_AMBIGUOUS(_interface, _implClass) \ if ( aIID.Equals(NS_GET_IID(_interface)) ) \ foundInterface = NS_STATIC_CAST(_interface*, \ NS_STATIC_CAST(_implClass*, this)); \ else#define NS_IMPL_QUERY_BODY_AGGREGATED(_interface, _aggregate) \ if ( aIID.Equals(NS_GET_IID(_interface)) ) \ foundInterface = NS_STATIC_CAST(_interface*, _aggregate); \ else#define NS_IMPL_QUERY_TAIL_GUTS \ foundInterface = 0; \ nsresult status; \ if ( !foundInterface ) \ status = NS_NOINTERFACE; \ else \ { \ NS_ADDREF(foundInterface); \ status = NS_OK; \ } \ *aInstancePtr = foundInterface; \ return status; \}#define NS_IMPL_QUERY_TAIL_INHERITING(_baseclass) \ foundInterface = 0; \ nsresult status; \ if ( !foundInterface ) \ status = _baseclass::QueryInterface(aIID, (void**)&foundInterface); \ else \ { \ NS_ADDREF(foundInterface); \ status = NS_OK; \ } \ *aInstancePtr = foundInterface; \ return status; \}#define NS_IMPL_QUERY_TAIL_USING_AGGREGATOR(_aggregator) \ foundInterface = 0; \ nsresult status; \ if ( !foundInterface ) { \ NS_ASSERTION(_aggregator, "null aggregator"); \ status = _aggregator->QueryInterface(aIID, (void**)&foundInterface); \ } else \ { \ NS_ADDREF(foundInterface); \ status = NS_OK; \ } \ *aInstancePtr = foundInterface; \ return status; \}#define NS_IMPL_QUERY_TAIL(_supports_interface) \ NS_IMPL_QUERY_BODY_AMBIGUOUS(nsISupports, _supports_interface) \ NS_IMPL_QUERY_TAIL_GUTS /* This is the new scheme. Using this notation now will allow us to switch to a table driven mechanism when it's ready. Note the difference between this and the (currently) underlying NS_IMPL_QUERY_INTERFACE mechanism. You must explicitly mention |nsISupports| when using the interface maps. */#define NS_INTERFACE_MAP_BEGIN(_implClass) NS_IMPL_QUERY_HEAD(_implClass)#define NS_INTERFACE_MAP_ENTRY(_interface) NS_IMPL_QUERY_BODY(_interface)#define NS_INTERFACE_MAP_ENTRY_CONDITIONAL(_interface, condition) \ NS_IMPL_QUERY_BODY_CONDITIONAL(_interface, condition)#define NS_INTERFACE_MAP_ENTRY_AGGREGATED(_interface,_aggregate) \ NS_IMPL_QUERY_BODY_AGGREGATED(_interface,_aggregate)#define NS_INTERFACE_MAP_END NS_IMPL_QUERY_TAIL_GUTS#define NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(_interface, _implClass) \ NS_IMPL_QUERY_BODY_AMBIGUOUS(_interface, _implClass)#define NS_INTERFACE_MAP_END_INHERITING(_baseClass) \ NS_IMPL_QUERY_TAIL_INHERITING(_baseClass)#define NS_INTERFACE_MAP_END_AGGREGATED(_aggregator) \ NS_IMPL_QUERY_TAIL_USING_AGGREGATOR(_aggregator)#define NS_IMPL_QUERY_INTERFACE0(_class) \ NS_INTERFACE_MAP_BEGIN(_class) \ NS_INTERFACE_MAP_ENTRY(nsISupports) \ NS_INTERFACE_MAP_END#define NS_IMPL_QUERY_INTERFACE1(_class, _i1) \ NS_INTERFACE_MAP_BEGIN(_class) \ NS_INTERFACE_MAP_ENTRY(_i1) \ NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, _i1) \ NS_INTERFACE_MAP_END#define NS_IMPL_QUERY_INTERFACE2(_class, _i1, _i2) \ NS_INTERFACE_MAP_BEGIN(_class) \ NS_INTERFACE_MAP_ENTRY(_i1) \ NS_INTERFACE_MAP_ENTRY(_i2) \ NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, _i1) \ NS_INTERFACE_MAP_END#define NS_IMPL_QUERY_INTERFACE3(_class, _i1, _i2, _i3) \ NS_INTERFACE_MAP_BEGIN(_class) \ NS_INTERFACE_MAP_ENTRY(_i1) \ NS_INTERFACE_MAP_ENTRY(_i2) \ NS_INTERFACE_MAP_ENTRY(_i3) \ NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, _i1) \ NS_INTERFACE_MAP_END#define NS_IMPL_QUERY_INTERFACE4(_class, _i1, _i2, _i3, _i4) \ NS_INTERFACE_MAP_BEGIN(_class) \ NS_INTERFACE_MAP_ENTRY(_i1) \ NS_INTERFACE_MAP_ENTRY(_i2) \ NS_INTERFACE_MAP_ENTRY(_i3) \ NS_INTERFACE_MAP_ENTRY(_i4) \ NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, _i1) \ NS_INTERFACE_MAP_END#define NS_IMPL_QUERY_INTERFACE5(_class, _i1, _i2, _i3, _i4, _i5) \ NS_INTERFACE_MAP_BEGIN(_class) \ NS_INTERFACE_MAP_ENTRY(_i1) \ NS_INTERFACE_MAP_ENTRY(_i2) \ NS_INTERFACE_MAP_ENTRY(_i3) \ NS_INTERFACE_MAP_ENTRY(_i4) \ NS_INTERFACE_MAP_ENTRY(_i5) \ NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, _i1) \ NS_INTERFACE_MAP_END#define NS_IMPL_QUERY_INTERFACE6(_class, _i1, _i2, _i3, _i4, _i5, _i6) \ NS_INTERFACE_MAP_BEGIN(_class) \ NS_INTERFACE_MAP_ENTRY(_i1) \ NS_INTERFACE_MAP_ENTRY(_i2) \ NS_INTERFACE_MAP_ENTRY(_i3) \ NS_INTERFACE_MAP_ENTRY(_i4) \ NS_INTERFACE_MAP_ENTRY(_i5) \ NS_INTERFACE_MAP_ENTRY(_i6) \ NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, _i1) \ NS_INTERFACE_MAP_END#define NS_IMPL_QUERY_INTERFACE7(_class, _i1, _i2, _i3, _i4, _i5, _i6, _i7) \ NS_INTERFACE_MAP_BEGIN(_class) \ NS_INTERFACE_MAP_ENTRY(_i1) \ NS_INTERFACE_MAP_ENTRY(_i2) \ NS_INTERFACE_MAP_ENTRY(_i3) \ NS_INTERFACE_MAP_ENTRY(_i4) \ NS_INTERFACE_MAP_ENTRY(_i5) \ NS_INTERFACE_MAP_ENTRY(_i6) \ NS_INTERFACE_MAP_ENTRY(_i7) \ NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, _i1) \ NS_INTERFACE_MAP_END#define NS_IMPL_QUERY_INTERFACE8(_class, _i1, _i2, _i3, _i4, _i5, _i6, \ _i7, _i8) \ NS_INTERFACE_MAP_BEGIN(_class) \ NS_INTERFACE_MAP_ENTRY(_i1) \ NS_INTERFACE_MAP_ENTRY(_i2) \ NS_INTERFACE_MAP_ENTRY(_i3) \ NS_INTERFACE_MAP_ENTRY(_i4) \ NS_INTERFACE_MAP_ENTRY(_i5) \ NS_INTERFACE_MAP_ENTRY(_i6) \ NS_INTERFACE_MAP_ENTRY(_i7) \ NS_INTERFACE_MAP_ENTRY(_i8) \ NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, _i1) \ NS_INTERFACE_MAP_END#define NS_IMPL_QUERY_INTERFACE9(_class, _i1, _i2, _i3, _i4, _i5, _i6, \ _i7, _i8, _i9) \ NS_INTERFACE_MAP_BEGIN(_class) \ NS_INTERFACE_MAP_ENTRY(_i1) \ NS_INTERFACE_MAP_ENTRY(_i2) \ NS_INTERFACE_MAP_ENTRY(_i3) \ NS_INTERFACE_MAP_ENTRY(_i4) \ NS_INTERFACE_MAP_ENTRY(_i5) \ NS_INTERFACE_MAP_ENTRY(_i6) \ NS_INTERFACE_MAP_ENTRY(_i7) \ NS_INTERFACE_MAP_ENTRY(_i8) \ NS_INTERFACE_MAP_ENTRY(_i9) \ NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, _i1) \ NS_INTERFACE_MAP_END#define NS_IMPL_QUERY_INTERFACE10(_class, _i1, _i2, _i3, _i4, _i5, _i6, \ _i7, _i8, _i9, _i10) \ NS_INTERFACE_MAP_BEGIN(_class) \ NS_INTERFACE_MAP_ENTRY(_i1) \ NS_INTERFACE_MAP_ENTRY(_i2) \ NS_INTERFACE_MAP_ENTRY(_i3) \ NS_INTERFACE_MAP_ENTRY(_i4) \ NS_INTERFACE_MAP_ENTRY(_i5) \ NS_INTERFACE_MAP_ENTRY(_i6) \ NS_INTERFACE_MAP_ENTRY(_i7) \ NS_INTERFACE_MAP_ENTRY(_i8) \ NS_INTERFACE_MAP_ENTRY(_i9) \ NS_INTERFACE_MAP_ENTRY(_i10) \ NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, _i1) \ NS_INTERFACE_MAP_END#define NS_IMPL_QUERY_INTERFACE11(_class, _i1, _i2, _i3, _i4, _i5, _i6, \ _i7, _i8, _i9, _i10, _i11) \ NS_INTERFACE_MAP_BEGIN(_class) \
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -