294687295d
PiperOrigin-RevId: 263889205
55 lines
2.2 KiB
C
55 lines
2.2 KiB
C
// Copyright 2019 The MediaPipe Authors.
|
|
//
|
|
// 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.
|
|
//
|
|
// OBJC_LINTER
|
|
|
|
// TODO: check license. This was forked from an internal header.
|
|
|
|
/**
|
|
* __WEAKNAME_ is a private macro used to generate a local variable name related
|
|
* to the argument variable name. This generated local variable name is
|
|
* intentionally stable across multiple invocations.
|
|
*/
|
|
#define __WEAKNAME_(variable) variable##_weak_
|
|
|
|
/**
|
|
* WEAKIFY defines a new local variable that is a weak reference to the argument
|
|
* variable.
|
|
*
|
|
* This macro is generally used to capture a weak reference to be captured by an
|
|
* Objective-C block to avoid unintentionally extending an object's lifetime or
|
|
* avoid causing a retain cycle.
|
|
*
|
|
* The new local variable's name will be based on the name of the target
|
|
* variable and is stable across multiple invocations of WEAKIFY. In general,
|
|
* you should not need to invoke WEAKIFY multiple times on the same variable.
|
|
*/
|
|
#define WEAKIFY(variable) \
|
|
__weak __typeof__(variable) __WEAKNAME_(variable) = (variable)
|
|
|
|
/**
|
|
* STRONGIFY defines a new shadow local variable with the same name as the
|
|
* argument variable and initialize it with a resolved weak reference based on a
|
|
* weak reference created previously using the WEAKIFY macro.
|
|
*
|
|
* @note:
|
|
* This macro must be called within each block scope to prevent nested blocks
|
|
* from capturing a strong reference from an outer block.
|
|
*/
|
|
#define STRONGIFY(variable) \
|
|
_Pragma("clang diagnostic push") \
|
|
_Pragma("clang diagnostic ignored \"-Wshadow\"") \
|
|
__strong __typeof__(variable) variable = \
|
|
__WEAKNAME_(variable) _Pragma("clang diagnostic pop")
|