/core/externals/google-toolbox-for-mac/DebugUtils/GTMTypeCasting.h
http://macfuse.googlecode.com/ · C Header · 71 lines · 26 code · 6 blank · 39 comment · 1 complexity · 9dc161cb16e77d6d9c840c44842a9b38 MD5 · raw file
- //
- // GTMTypeCasting.h
- //
- // Copyright 2010 Google Inc.
- //
- // Licensed under the Apache License, Version 2.0 (the "License"); you may not
- // use this file except in compliance with the License. You may obtain a copy
- // of the License at
- //
- // http://www.apache.org/licenses/LICENSE-2.0
- //
- // Unless required by applicable law or agreed to in writing, software
- // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- // License for the specific language governing permissions and limitations under
- // the License.
- //
- #import <Foundation/Foundation.h>
- #import "GTMDefines.h"
- // These are some basic macros for making down-casting safer in Objective C.
- // They are loosely based on the same cast types with similar names in C++.
- // A typical usage would look like this:
- //
- // Bar* b = [[Bar alloc] init];
- // Foo* a = GTM_STATIC_CAST(Foo, b);
- //
- // Note that it's GTM_STATIC_CAST(Foo, b) and not GTM_STATIC_CAST(Foo*, b).
- //
- // GTM_STATIC_CAST runs only in debug mode, and will assert if and only if:
- // - object is non nil
- // - [object isKindOfClass:[cls class]] returns nil
- //
- // otherwise it returns object.
- //
- // GTM_DYNAMIC_CAST runs in both debug and release and will return nil if
- // - object is nil
- // - [object isKindOfClass:[cls class]] returns nil
- //
- // otherwise it returns object.
- //
- // Support functions for dealing with casting.
- GTM_INLINE id GTMDynamicCastSupport(Class cls, id object) {
- _GTMDevAssert(cls, @"Nil Class");
- return [object isKindOfClass:cls] ? object : nil;
- }
- GTM_INLINE id GTMStaticCastSupport(Class cls, id object) {
- id value = nil;
- if (object) {
- value = GTMDynamicCastSupport(cls, object);
- _GTMDevAssert(value, @"Could not cast %@ to class %@", object, cls);
- }
- return value;
- }
- #ifndef GTM_STATIC_CAST
- #ifdef DEBUG
- #define GTM_STATIC_CAST(type, object) GTMStaticCastSupport([type class], \
- object)
- #else
- #define GTM_STATIC_CAST(type, object) ((type *) (object))
- #endif
- #endif
- #ifndef GTM_DYNAMIC_CAST
- #define GTM_DYNAMIC_CAST(type, object) GTMDynamicCastSupport([type class], \
- object)
- #endif