New file |
| | |
| | | // |
| | | // 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)) |