Reviewed by Ken.
[WebKit-https.git] / WebCore / kwq / KWQFoundationExtras.h
1 /*
2  * Copyright (C) 2004 Apple Computer, Inc.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #import <Foundation/Foundation.h>
27
28 // nil-checked CFRetain/CFRelease covers for Objective-C ids
29
30 // Use CFRetain, CFRelease, KWQRetain, or KWQRelease instead of
31 // -[NSObject retain] and -[NSObject release] if you want to store
32 // a pointer to an Objective-C object into memory that won't
33 // be scanned for GC, like a C++ object.
34
35 static inline id KWQRetain(id obj)
36 {
37     if (obj) CFRetain(obj);
38     return obj;
39 }
40
41 static inline void KWQRelease(id obj)
42 {
43     if (obj) CFRelease(obj);
44 }
45
46 // As if CF and Foundation had logically separate reference counts,
47 // this function first increments the CF retain count, and then
48 // decrements the NS retain count. This is needed to handle cases where
49 // -retain/-release aren't equivalent to CFRetain/KWQRelease, such as
50 // when GC is used.
51
52 // Use KWQRetainNSRelease after allocating and initializing a NSObject
53 // if you want to store a pointer to that object into memory that won't
54 // be scanned for GC, like a C++ object.
55
56 static inline id KWQRetainNSRelease(id obj)
57 {
58     KWQRetain(obj);
59     [obj release];
60     return obj;
61 }
62
63 // Definitions for GC-specific methods for Panther.
64 // The finalize method simply won't be called.
65
66 #if MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_3
67
68 @interface NSObject (KWQFoundationExtras)
69 - (void)finalize;
70 @end
71
72 #endif