mirror of
				https://github.com/SoPat712/YTLitePlus.git
				synced 2025-10-31 04:44:14 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			109 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
	
	
			
		
		
	
	
			109 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
	
	
| //
 | |
| //  FLEXRuntimeUtility.h
 | |
| //  Flipboard
 | |
| //
 | |
| //  Created by Ryan Olson on 6/8/14.
 | |
| //  Copyright (c) 2020 FLEX Team. All rights reserved.
 | |
| //
 | |
| 
 | |
| #import "FLEXRuntimeConstants.h"
 | |
| 
 | |
| #define PropertyKey(suffix) kFLEXPropertyAttributeKey##suffix : @""
 | |
| #define PropertyKeyGetter(getter) kFLEXPropertyAttributeKeyCustomGetter : NSStringFromSelector(@selector(getter))
 | |
| #define PropertyKeySetter(setter) kFLEXPropertyAttributeKeyCustomSetter : NSStringFromSelector(@selector(setter))
 | |
| 
 | |
| /// Takes: min iOS version, property name, target class, property type, and a list of attributes
 | |
| #define FLEXRuntimeUtilityTryAddProperty(iOS_atLeast, name, cls, type, ...) ({ \
 | |
|     if (@available(iOS iOS_atLeast, *)) { \
 | |
|         NSMutableDictionary *attrs = [NSMutableDictionary dictionaryWithDictionary:@{ \
 | |
|             kFLEXPropertyAttributeKeyTypeEncoding : @(type), \
 | |
|             __VA_ARGS__ \
 | |
|         }]; \
 | |
|         [FLEXRuntimeUtility \
 | |
|             tryAddPropertyWithName:#name \
 | |
|             attributes:attrs \
 | |
|             toClass:cls \
 | |
|         ]; \
 | |
|     } \
 | |
| })
 | |
| 
 | |
| /// Takes: min iOS version, property name, target class, property type, and a list of attributes
 | |
| #define FLEXRuntimeUtilityTryAddNonatomicProperty(iOS_atLeast, name, cls, type, ...) \
 | |
|     FLEXRuntimeUtilityTryAddProperty(iOS_atLeast, name, cls, @encode(type), PropertyKey(NonAtomic), __VA_ARGS__);
 | |
| /// Takes: min iOS version, property name, target class, property type (class name), and a list of attributes
 | |
| #define FLEXRuntimeUtilityTryAddObjectProperty(iOS_atLeast, name, cls, type, ...) \
 | |
|     FLEXRuntimeUtilityTryAddProperty(iOS_atLeast, name, cls, FLEXEncodeClass(type), PropertyKey(NonAtomic), __VA_ARGS__);
 | |
| 
 | |
| extern NSString * const FLEXRuntimeUtilityErrorDomain;
 | |
| 
 | |
| typedef NS_ENUM(NSInteger, FLEXRuntimeUtilityErrorCode) {
 | |
|     // Start at a random value instead of 0 to avoid confusion with an absent code
 | |
|     FLEXRuntimeUtilityErrorCodeDoesNotRecognizeSelector = 0xbabe,
 | |
|     FLEXRuntimeUtilityErrorCodeInvocationFailed,
 | |
|     FLEXRuntimeUtilityErrorCodeArgumentTypeMismatch
 | |
| };
 | |
| 
 | |
| @interface FLEXRuntimeUtility : NSObject
 | |
| 
 | |
| // General Helpers
 | |
| + (BOOL)pointerIsValidObjcObject:(const void *)pointer;
 | |
| /// Unwraps raw pointers to objects stored in NSValue, and re-boxes C strings into NSStrings.
 | |
| + (id)potentiallyUnwrapBoxedPointer:(id)returnedObjectOrNil type:(const FLEXTypeEncoding *)returnType;
 | |
| /// Some fields have a name in their encoded string (e.g. \"width\"d)
 | |
| /// @return the offset to skip the field name, 0 if there is no name
 | |
| + (NSUInteger)fieldNameOffsetForTypeEncoding:(const FLEXTypeEncoding *)typeEncoding;
 | |
| /// Given name "foo" and type "int" this would return "int foo", but
 | |
| /// given name "foo" and type "T *" it would return "T *foo"
 | |
| + (NSString *)appendName:(NSString *)name toType:(NSString *)typeEncoding;
 | |
| 
 | |
| /// @return The class hierarchy for the given object or class,
 | |
| /// from the current class to the root-most class.
 | |
| + (NSArray<Class> *)classHierarchyOfObject:(id)objectOrClass;
 | |
| 
 | |
| /// Used to describe an object in brief within an explorer row
 | |
| + (NSString *)summaryForObject:(id)value;
 | |
| + (NSString *)safeClassNameForObject:(id)object;
 | |
| + (NSString *)safeDescriptionForObject:(id)object;
 | |
| + (NSString *)safeDebugDescriptionForObject:(id)object;
 | |
| 
 | |
| + (BOOL)safeObject:(id)object isKindOfClass:(Class)cls;
 | |
| + (BOOL)safeObject:(id)object respondsToSelector:(SEL)sel;
 | |
| 
 | |
| // Property Helpers
 | |
| + (BOOL)tryAddPropertyWithName:(const char *)name
 | |
|                     attributes:(NSDictionary<NSString *, NSString *> *)attributePairs
 | |
|                        toClass:(__unsafe_unretained Class)theClass;
 | |
| + (NSArray<NSString *> *)allPropertyAttributeKeys;
 | |
| 
 | |
| // Method Helpers
 | |
| + (NSArray *)prettyArgumentComponentsForMethod:(Method)method;
 | |
| 
 | |
| // Method Calling/Field Editing
 | |
| + (id)performSelector:(SEL)selector onObject:(id)object;
 | |
| + (id)performSelector:(SEL)selector
 | |
|              onObject:(id)object
 | |
|         withArguments:(NSArray *)arguments
 | |
|                 error:(NSError * __autoreleasing *)error;
 | |
| + (id)performSelector:(SEL)selector
 | |
|              onObject:(id)object
 | |
|         withArguments:(NSArray *)arguments
 | |
|       allowForwarding:(BOOL)mightForwardMsgSend
 | |
|                 error:(NSError * __autoreleasing *)error;
 | |
| 
 | |
| + (NSString *)editableJSONStringForObject:(id)object;
 | |
| + (id)objectValueFromEditableJSONString:(NSString *)string;
 | |
| + (NSValue *)valueForNumberWithObjCType:(const char *)typeEncoding fromInputString:(NSString *)inputString;
 | |
| + (void)enumerateTypesInStructEncoding:(const char *)structEncoding
 | |
|                             usingBlock:(void (^)(NSString *structName,
 | |
|                                                  const char *fieldTypeEncoding,
 | |
|                                                  NSString *prettyTypeEncoding,
 | |
|                                                  NSUInteger fieldIndex,
 | |
|                                                  NSUInteger fieldOffset))typeBlock;
 | |
| + (NSValue *)valueForPrimitivePointer:(void *)pointer objCType:(const char *)type;
 | |
| 
 | |
| #pragma mark - Metadata Helpers
 | |
| 
 | |
| + (NSString *)readableTypeForEncoding:(NSString *)encodingString;
 | |
| 
 | |
| @end
 | 
