blob: 9828c736ea6ee4d30da0cf03337d5ca97875b6e2 [file] [log] [blame]
/*
* Copyright (c) 2021-2022 Apple Inc. All rights reserved.
*
* 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
*
* https://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.
*/
#ifndef MRCS_OBJECT_H
#define MRCS_OBJECT_H
#include "mrcs_object_members.h"
#include <CoreFoundation/CoreFoundation.h>
#include <mdns/base.h>
#define MRCS_BASE_DECL(NAME) MDNS_COMMON_BASE_DECL(mrcs_ ## NAME)
#define MRCS_DECL_SUBKIND(NAME, SUPER) MDNS_COMMON_DECL_SUBKIND(mrcs_ ## NAME, mrcs_ ## SUPER)
#define MRCS_DECL(NAME) MRCS_DECL_SUBKIND(NAME, object)
MRCS_BASE_DECL(object);
MDNS_ASSUME_NONNULL_BEGIN
/*!
* @typedef mrcs_any_t
* @brief
* A pointer to an mrcs object.
*/
#if OS_OBJECT_USE_OBJC
typedef mrcs_object_t mrcs_any_t;
#else
#if defined(__cplusplus)
typedef void * mrcs_any_t;
#else
typedef union {
MRCS_OBJECT_MEMBERS
} mrcs_any_t __attribute__((__transparent_union__));
#endif
#endif
__BEGIN_DECLS
/*!
* @brief
* Increments the reference count of an mrcs object.
*
* @param object
* The mrcs object.
*/
void
mrcs_retain(mrcs_any_t object);
#if OS_OBJECT_USE_OBJC_RETAIN_RELEASE
#undef mrcs_retain
#define mrcs_retain(object) (void)[(object) retain]
#endif
/*!
* @brief
* Decrements the reference count of an mrcs object.
*
* @param object
* The mrcs object.
*/
void
mrcs_release(mrcs_any_t object);
#if OS_OBJECT_USE_OBJC_RETAIN_RELEASE
#undef mrcs_release
#define mrcs_release(object) [(object) release]
#endif
/*!
* @brief
* Creates a human-readable description of an mrcs object as a C string encoded in UTF-8.
*
* @param object
* The mrcs object.
*
* @result
* A C string that must be freed with free(3), or NULL if memory allocation failed.
*/
MDNS_WARN_RESULT
char * _Nullable
mrcs_copy_description(mrcs_any_t object);
/*!
* @brief
* Explicitly retains an mrcs object if ARC is disabled. Does nothing if ARC is enabled.
*
* @param object
* The mrcs object.
*
* @discussion
* This is a convenience function that allows writing portable Objective-C code regardless of whether ARC
* is enabled or disabled.
*/
static inline void
mrcs_retain_arc_safe(const mrcs_any_t object)
{
#if OS_OBJECT_USE_OBJC && __has_feature(objc_arc)
(void)object;
#else
mrcs_retain(object);
#endif
}
/*!
* @brief
* Explicitly releases an mrcs object if ARC is disabled. Does nothing if ARC is enabled.
*
* @param object
* The mrcs object.
*
* @discussion
* This is a convenience function that allows writing portable Objective-C code regardless of whether ARC
* is enabled or disabled.
*/
static inline void
mrcs_release_arc_safe(const mrcs_any_t object)
{
#if OS_OBJECT_USE_OBJC && __has_feature(objc_arc)
(void)object;
#else
mrcs_release(object);
#endif
}
__END_DECLS
MDNS_ASSUME_NONNULL_END
#define mrcs_forget(PTR) \
do { \
if (*(PTR)) { \
mrcs_release_arc_safe(*(PTR)); \
*(PTR) = NULL; \
} \
} while(0)
#endif // MRCS_OBJECT_H