You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
136 lines
6.1 KiB
136 lines
6.1 KiB
// |
|
// 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))
|
|
|