#
# Copyright (c) 2013 Apple Inc. All rights reserved.
#
# @APPLE_APACHE_LICENSE_HEADER_START@
#
# 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.
#
# @APPLE_APACHE_LICENSE_HEADER_END@
#

# Must be kept in sync with ObjC TFB checks in object_internal.h

# dispatch_object_t classes
_OBJC_CLASS_$_OS_dispatch_object
_OBJC_CLASS_$_OS_dispatch_semaphore
__OS_dispatch_semaphore_vtable
_OBJC_CLASS_$_OS_dispatch_group
__OS_dispatch_group_vtable
_OBJC_CLASS_$_OS_dispatch_queue
__OS_dispatch_queue_vtable
_OBJC_CLASS_$_OS_dispatch_workloop
__OS_dispatch_workloop_vtable
_OBJC_CLASS_$_OS_dispatch_queue_serial
__OS_dispatch_queue_serial_vtable
_OBJC_CLASS_$_OS_dispatch_queue_concurrent
__OS_dispatch_queue_concurrent_vtable
_OBJC_CLASS_$_OS_dispatch_queue_global
__OS_dispatch_queue_global_vtable
_OBJC_CLASS_$_OS_dispatch_queue_pthread_root
__OS_dispatch_queue_pthread_root_vtable
_OBJC_CLASS_$_OS_dispatch_queue_main
__OS_dispatch_queue_main_vtable
_OBJC_CLASS_$_OS_dispatch_queue_runloop
__OS_dispatch_queue_runloop_vtable
_OBJC_CLASS_$_OS_dispatch_queue_mgr
__OS_dispatch_queue_mgr_vtable
_OBJC_CLASS_$_OS_dispatch_queue_attr
__OS_dispatch_queue_attr_vtable
_OBJC_CLASS_$_OS_dispatch_source
__OS_dispatch_source_vtable
_OBJC_CLASS_$_OS_dispatch_mach
__OS_dispatch_mach_vtable
_OBJC_CLASS_$_OS_dispatch_mach_msg
__OS_dispatch_mach_msg_vtable
_OBJC_CLASS_$_OS_dispatch_io
__OS_dispatch_io_vtable
_OBJC_CLASS_$_OS_dispatch_operation
__OS_dispatch_operation_vtable
_OBJC_CLASS_$_OS_dispatch_disk
__OS_dispatch_disk_vtable
# os_object_t classes
_OBJC_CLASS_$_OS_object
_OBJC_CLASS_$_OS_voucher
#_OBJC_CLASS_$_OS_voucher_recipe
# non-os_object_t classes
_OBJC_CLASS_$_OS_dispatch_data
_OBJC_CLASS_$_OS_dispatch_data_empty
# metaclasses
_OBJC_METACLASS_$_OS_dispatch_object
_OBJC_METACLASS_$_OS_dispatch_semaphore
_OBJC_METACLASS_$_OS_dispatch_group
_OBJC_METACLASS_$_OS_dispatch_queue
_OBJC_METACLASS_$_OS_dispatch_workloop
_OBJC_METACLASS_$_OS_dispatch_queue_serial
_OBJC_METACLASS_$_OS_dispatch_queue_concurrent
_OBJC_METACLASS_$_OS_dispatch_queue_global
_OBJC_METACLASS_$_OS_dispatch_queue_pthread_root
_OBJC_METACLASS_$_OS_dispatch_queue_main
_OBJC_METACLASS_$_OS_dispatch_queue_runloop
_OBJC_METACLASS_$_OS_dispatch_queue_mgr
_OBJC_METACLASS_$_OS_dispatch_queue_attr
_OBJC_METACLASS_$_OS_dispatch_source
_OBJC_METACLASS_$_OS_dispatch_mach
_OBJC_METACLASS_$_OS_dispatch_mach_msg
_OBJC_METACLASS_$_OS_dispatch_io
_OBJC_METACLASS_$_OS_dispatch_operation
_OBJC_METACLASS_$_OS_dispatch_disk
_OBJC_METACLASS_$_OS_object
_OBJC_METACLASS_$_OS_voucher
#_OBJC_METACLASS_$_OS_voucher_recipe
_OBJC_METACLASS_$_OS_dispatch_data
_OBJC_METACLASS_$_OS_dispatch_data_empty
