123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- //
- // MASUtilities.h
- // Masonry
- //
- // Created by Jonas Budelmann on 19/08/13.
- // Copyright (c) 2013 Jonas Budelmann. All rights reserved.
- //
- #import <Foundation/Foundation.h>
- #if TARGET_OS_IPHONE || TARGET_OS_TV
- #import <UIKit/UIKit.h>
- #define MAS_VIEW UIView
- #define MAS_VIEW_CONTROLLER UIViewController
- #define MASEdgeInsets UIEdgeInsets
- typedef UILayoutPriority MASLayoutPriority;
- static const MASLayoutPriority MASLayoutPriorityRequired = UILayoutPriorityRequired;
- static const MASLayoutPriority MASLayoutPriorityDefaultHigh = UILayoutPriorityDefaultHigh;
- static const MASLayoutPriority MASLayoutPriorityDefaultMedium = 500;
- static const MASLayoutPriority MASLayoutPriorityDefaultLow = UILayoutPriorityDefaultLow;
- static const MASLayoutPriority MASLayoutPriorityFittingSizeLevel = UILayoutPriorityFittingSizeLevel;
- #elif TARGET_OS_MAC
- #import <AppKit/AppKit.h>
- #define MAS_VIEW NSView
- #define MASEdgeInsets NSEdgeInsets
- typedef NSLayoutPriority MASLayoutPriority;
- static const MASLayoutPriority MASLayoutPriorityRequired = NSLayoutPriorityRequired;
- static const MASLayoutPriority MASLayoutPriorityDefaultHigh = NSLayoutPriorityDefaultHigh;
- static const MASLayoutPriority MASLayoutPriorityDragThatCanResizeWindow = NSLayoutPriorityDragThatCanResizeWindow;
- static const MASLayoutPriority MASLayoutPriorityDefaultMedium = 501;
- static const MASLayoutPriority MASLayoutPriorityWindowSizeStayPut = NSLayoutPriorityWindowSizeStayPut;
- static const MASLayoutPriority MASLayoutPriorityDragThatCannotResizeWindow = NSLayoutPriorityDragThatCannotResizeWindow;
- static const MASLayoutPriority MASLayoutPriorityDefaultLow = NSLayoutPriorityDefaultLow;
- static const MASLayoutPriority MASLayoutPriorityFittingSizeCompression = NSLayoutPriorityFittingSizeCompression;
- #endif
- /**
- * Allows you to attach keys to objects matching the variable names passed.
- *
- * view1.mas_key = @"view1", view2.mas_key = @"view2";
- *
- * is equivalent to:
- *
- * MASAttachKeys(view1, view2);
- */
- #define MASAttachKeys(...) \
- { \
- NSDictionary *keyPairs = NSDictionaryOfVariableBindings(__VA_ARGS__); \
- for (id key in keyPairs.allKeys) { \
- id obj = keyPairs[key]; \
- NSAssert([obj respondsToSelector:@selector(setMas_key:)], \
- @"Cannot attach mas_key to %@", obj); \
- [obj setMas_key:key]; \
- } \
- }
- /**
- * Used to create object hashes
- * Based on http://www.mikeash.com/pyblog/friday-qa-2010-06-18-implementing-equality-and-hashing.html
- */
- #define MAS_NSUINT_BIT (CHAR_BIT * sizeof(NSUInteger))
- #define MAS_NSUINTROTATE(val, howmuch) ((((NSUInteger)val) << howmuch) | (((NSUInteger)val) >> (MAS_NSUINT_BIT - howmuch)))
- /**
- * Given a scalar or struct value, wraps it in NSValue
- * Based on EXPObjectify: https://github.com/specta/expecta
- */
- static inline id _MASBoxValue(const char *type, ...) {
- va_list v;
- va_start(v, type);
- id obj = nil;
- if (strcmp(type, @encode(id)) == 0) {
- id actual = va_arg(v, id);
- obj = actual;
- } else if (strcmp(type, @encode(CGPoint)) == 0) {
- CGPoint actual = (CGPoint)va_arg(v, CGPoint);
- obj = [NSValue value:&actual withObjCType:type];
- } else if (strcmp(type, @encode(CGSize)) == 0) {
- CGSize actual = (CGSize)va_arg(v, CGSize);
- obj = [NSValue value:&actual withObjCType:type];
- } else if (strcmp(type, @encode(MASEdgeInsets)) == 0) {
- MASEdgeInsets actual = (MASEdgeInsets)va_arg(v, MASEdgeInsets);
- obj = [NSValue value:&actual withObjCType:type];
- } else if (strcmp(type, @encode(double)) == 0) {
- double actual = (double)va_arg(v, double);
- obj = [NSNumber numberWithDouble:actual];
- } else if (strcmp(type, @encode(float)) == 0) {
- float actual = (float)va_arg(v, double);
- obj = [NSNumber numberWithFloat:actual];
- } else if (strcmp(type, @encode(int)) == 0) {
- int actual = (int)va_arg(v, int);
- obj = [NSNumber numberWithInt:actual];
- } else if (strcmp(type, @encode(long)) == 0) {
- long actual = (long)va_arg(v, long);
- obj = [NSNumber numberWithLong:actual];
- } else if (strcmp(type, @encode(long long)) == 0) {
- long long actual = (long long)va_arg(v, long long);
- obj = [NSNumber numberWithLongLong:actual];
- } else if (strcmp(type, @encode(short)) == 0) {
- short actual = (short)va_arg(v, int);
- obj = [NSNumber numberWithShort:actual];
- } else if (strcmp(type, @encode(char)) == 0) {
- char actual = (char)va_arg(v, int);
- obj = [NSNumber numberWithChar:actual];
- } else if (strcmp(type, @encode(bool)) == 0) {
- bool actual = (bool)va_arg(v, int);
- obj = [NSNumber numberWithBool:actual];
- } else if (strcmp(type, @encode(unsigned char)) == 0) {
- unsigned char actual = (unsigned char)va_arg(v, unsigned int);
- obj = [NSNumber numberWithUnsignedChar:actual];
- } else if (strcmp(type, @encode(unsigned int)) == 0) {
- unsigned int actual = (unsigned int)va_arg(v, unsigned int);
- obj = [NSNumber numberWithUnsignedInt:actual];
- } else if (strcmp(type, @encode(unsigned long)) == 0) {
- unsigned long actual = (unsigned long)va_arg(v, unsigned long);
- obj = [NSNumber numberWithUnsignedLong:actual];
- } else if (strcmp(type, @encode(unsigned long long)) == 0) {
- unsigned long long actual = (unsigned long long)va_arg(v, unsigned long long);
- obj = [NSNumber numberWithUnsignedLongLong:actual];
- } else if (strcmp(type, @encode(unsigned short)) == 0) {
- unsigned short actual = (unsigned short)va_arg(v, unsigned int);
- obj = [NSNumber numberWithUnsignedShort:actual];
- }
- va_end(v);
- return obj;
- }
- #define MASBoxValue(value) _MASBoxValue(@encode(__typeof__((value))), (value))
|