3 #import <HexFiend/HFTypes.h> 4 #import <libkern/OSAtomic.h> 6 #define HFDEFAULT_FONT (@"Monaco") 7 #define HFDEFAULT_FONTSIZE ((CGFloat)10.) 9 #define HFZeroRange (HFRange){0, 0} 14 static inline HFRange HFRangeMake(
unsigned long long loc,
unsigned long long len) {
21 static inline BOOL HFLocationInRange(
unsigned long long location,
HFRange range) {
28 static inline NSString* HFRangeToString(
HFRange range) {
29 return [NSString stringWithFormat:@"{%llu, %llu}", range.location, range.length];
35 static inline NSString* HFFPRangeToString(
HFFPRange range) {
36 return [NSString stringWithFormat:@"{%Lf, %Lf}", range.location, range.length];
49 static inline BOOL HFSumDoesNotOverflow(
unsigned long long a,
unsigned long long b) {
56 static inline BOOL HFProductDoesNotOverflow(
unsigned long long a,
unsigned long long b) {
57 if (b == 0)
return YES;
58 unsigned long long result = a * b;
59 return result / b == a;
65 static inline NSUInteger HFProductInt(NSUInteger a, NSUInteger b) {
66 NSUInteger result = a * b;
67 assert(a == 0 || result / a == b);
74 static inline NSUInteger HFSumInt(NSUInteger a, NSUInteger b) {
82 static inline NSUInteger HFSumIntSaturate(NSUInteger a, NSUInteger b) {
83 NSUInteger result = a + b;
84 return (result < a) ? NSUIntegerMax : result;
90 static inline unsigned long long HFSumULLSaturate(
unsigned long long a,
unsigned long long b) {
91 unsigned long long result = a + b;
92 return (result < a) ? ULLONG_MAX : result;
98 static inline unsigned long long HFProductULL(
unsigned long long a,
unsigned long long b) {
99 unsigned long long result = a * b;
100 assert(HFProductDoesNotOverflow(a, b));
107 static inline unsigned long long HFSum(
unsigned long long a,
unsigned long long b) {
108 assert(HFSumDoesNotOverflow(a, b));
115 static inline unsigned long long HFMaxULL(
unsigned long long a,
unsigned long long b) {
116 return a < b ? b : a;
122 static inline unsigned long long HFSubtract(
unsigned long long a,
unsigned long long b) {
130 static inline unsigned long long HFRoundUpToMultiple(
unsigned long long a,
unsigned long long b) {
132 unsigned long long remainder = a % b;
133 if (remainder == 0)
return a;
134 else return HFSum(a, b - remainder);
140 static inline NSUInteger HFRoundUpToMultipleInt(NSUInteger a, NSUInteger b) {
142 NSUInteger remainder = a % b;
143 if (remainder == 0)
return a;
144 else return (NSUInteger)HFSum(a, b - remainder);
150 static inline NSUInteger HFLeastCommonMultiple(NSUInteger a, NSUInteger b) {
155 NSUInteger t, u = a, v = b;
163 return HFProductInt(a/u, b);
170 static inline unsigned long long HFRoundUpToNextMultipleSaturate(
unsigned long long a,
unsigned long long b) {
172 unsigned long long result = a + (b - a % b);
173 if (result < a) result = ULLONG_MAX;
178 static inline unsigned long long HFMaxRange(
HFRange a) {
184 static inline BOOL HFRangeIsSubrangeOfRange(
HFRange needle,
HFRange haystack) {
195 assert(HFRangeIsSubrangeOfRange(subrange, range));
198 outSuffix->
location = HFMaxRange(subrange);
211 return ! (clause1 || clause2);
226 assert(HFIntersectsRange(a, b) || HFMaxRange(a) == b.
location || HFMaxRange(b) == a.
location);
237 static inline BOOL HFSumIsLargerThanSum(
unsigned long long a,
unsigned long long b,
unsigned long long c,
unsigned long long d) {
240 unsigned int rem1 = (unsigned)(a%2 + b%2);
241 unsigned int rem2 = (unsigned)(c%2 + d%2);
242 unsigned long long sum1 = a/2 + b/2 + rem1/2;
243 unsigned long long sum2 = c/2 + d/2 + rem2/2;
244 if (sum1 > sum2)
return YES;
245 else if (sum1 < sum2)
return NO;
248 if (rem1%2 > rem2%2)
return YES;
253 unsigned long long xor1 = a^b;
254 unsigned long long xor2 = c^d;
255 unsigned long long avg1 = (a&b)+(xor1/2);
256 unsigned long long avg2 = (c&d)+(xor2/2);
257 unsigned s1l = avg1 > avg2;
258 unsigned eq = (avg1 == avg2);
259 return s1l | ((xor1 & ~xor2) & eq);
264 static inline unsigned long long HFAbsoluteDifference(
unsigned long long a,
unsigned long long b) {
265 if (a > b)
return a - b;
270 static inline BOOL HFRangeExtendsPastRange(
HFRange a,
HFRange b) {
276 unsigned long long minend = HFRangeExtendsPastRange(range2, range1) ? range1.
location + range1.
length : range2.
location + range2.
length;
283 return HFRangeMake(0, 0);
287 static inline CGFloat HFCeil(CGFloat a) {
288 if (
sizeof(a) ==
sizeof(
float))
return (CGFloat)ceilf((
float)a);
289 else return (CGFloat)ceil((
double)a);
293 static inline CGFloat HFFloor(CGFloat a) {
294 if (
sizeof(a) ==
sizeof(
float))
return (CGFloat)floorf((
float)a);
295 else return (CGFloat)floor((
double)a);
299 static inline CGFloat HFRound(CGFloat a) {
300 if (
sizeof(a) ==
sizeof(
float))
return (CGFloat)roundf((
float)a);
301 else return (CGFloat)round((
double)a);
305 static inline CGFloat HFMin(CGFloat a, CGFloat b) {
306 if (
sizeof(a) ==
sizeof(
float))
return (CGFloat)fminf((
float)a, (
float)b);
307 else return (CGFloat)fmin((
double)a, (
double)b);
311 static inline CGFloat HFMax(CGFloat a, CGFloat b) {
312 if (
sizeof(a) ==
sizeof(
float))
return (CGFloat)fmaxf((
float)a, (
float)b);
313 else return (CGFloat)fmax((
double)a, (
double)b);
322 static inline CGFloat HFCopysign(CGFloat a, CGFloat b) {
323 #if CGFLOAT_IS_DOUBLE 324 return copysign(a, b);
326 return copysignf(a, b);
331 static inline NSUInteger HFAtomicIncrement(
volatile NSUInteger *ptr, BOOL barrier) {
333 volatile unsigned *: (barrier ? OSAtomicIncrement32Barrier : OSAtomicIncrement32)((
volatile int32_t *)ptr),
334 #
if ULONG_MAX == UINT32_MAX
335 volatile unsigned long *: (barrier ? OSAtomicIncrement32Barrier : OSAtomicIncrement32)((
volatile int32_t *)ptr),
337 volatile unsigned long *: (barrier ? OSAtomicIncrement64Barrier : OSAtomicIncrement64)((
volatile int64_t *)ptr),
339 volatile unsigned long long *: (barrier ? OSAtomicIncrement64Barrier : OSAtomicIncrement64)((
volatile int64_t *)ptr));
343 static inline NSUInteger HFAtomicDecrement(
volatile NSUInteger *ptr, BOOL barrier) {
345 volatile unsigned *: (barrier ? OSAtomicDecrement32Barrier : OSAtomicDecrement32)((
volatile int32_t *)ptr),
346 #
if ULONG_MAX == UINT32_MAX
347 volatile unsigned long *: (barrier ? OSAtomicDecrement32Barrier : OSAtomicDecrement32)((
volatile int32_t *)ptr),
349 volatile unsigned long *: (barrier ? OSAtomicDecrement64Barrier : OSAtomicDecrement64)((
volatile int64_t *)ptr),
351 volatile unsigned long long *: (barrier ? OSAtomicDecrement64Barrier : OSAtomicDecrement64)((
volatile int64_t *)ptr));
355 static inline unsigned long long HFFPToUL(
long double val) {
357 assert(val <= ULLONG_MAX);
358 unsigned long long result = (
unsigned long long)val;
359 assert((
long double)result == val);
364 static inline long double HFULToFP(
unsigned long long val) {
365 long double result = (
long double)val;
366 assert(HFFPToUL(result) == val);
371 static inline NSString *HFDescribeAffineTransform(CGAffineTransform t) {
372 return [NSString stringWithFormat:@"%f %f 0\n%f %f 0\n%f %f 1", t.a, t.b, t.c, t.d, t.tx, t.ty];
376 static inline NSUInteger HFCountDigitsBase10(
unsigned long long val) {
377 const unsigned long long kValues[] = {0ULL, 9ULL, 99ULL, 999ULL, 9999ULL, 99999ULL, 999999ULL, 9999999ULL, 99999999ULL, 999999999ULL, 9999999999ULL, 99999999999ULL, 999999999999ULL, 9999999999999ULL, 99999999999999ULL, 999999999999999ULL, 9999999999999999ULL, 99999999999999999ULL, 999999999999999999ULL, 9999999999999999999ULL};
378 NSUInteger low = 0, high =
sizeof kValues /
sizeof *kValues;
380 NSUInteger mid = (low + high)/2;
381 if (val > kValues[mid]) {
392 static inline NSUInteger HFCountDigitsBase16(
unsigned long long val) {
394 if (val == 0)
return 1;
397 NSUInteger leadingZeros = (NSUInteger)__builtin_clzll(val);
398 NSUInteger logBase2 = (CHAR_BIT *
sizeof val) - leadingZeros - 1;
399 return 1 + logBase2/4;
409 static inline NSUInteger ll2l(
unsigned long long val) { assert(val <= ULONG_MAX);
return (
unsigned long)val; }
412 static inline uintptr_t ll2p(
unsigned long long val) { assert(val <= UINTPTR_MAX);
return (uintptr_t)val; }
415 static inline CGFloat ld2f(
long double val) {
418 assert(val <= CGFLOAT_MAX);
419 assert(val >= -CGFLOAT_MAX);
420 if ((val > 0 && val < CGFLOAT_MIN) || (val < 0 && val > -CGFLOAT_MIN)) {
421 NSLog(
@"Warning - conversion of long double %Lf to CGFloat will result in the non-normal CGFloat %f", val, (CGFloat)val);
429 static inline unsigned long long HFDivideULLRoundingUp(
unsigned long long a,
unsigned long long b) {
430 if (a == 0)
return 0;
431 else return ((a - 1) / b) + 1;
435 static inline NSUInteger HFDivideULRoundingUp(NSUInteger a, NSUInteger b) {
436 if (a == 0)
return 0;
437 else return ((a - 1) / b) + 1;
441 void HFDrawShadow(CGContextRef context, NSRect rect, CGFloat size, NSRectEdge rectEdge, BOOL active, NSRect clip);
467 + (NSArray *)withRanges:(
const HFRange *)ranges count:(NSUInteger)count;
470 + (void)getRanges:(
HFRange *)ranges fromArray:(NSArray *)array;
473 + (NSArray *)organizeAndMergeRanges:(NSArray *)inputRanges;
485 @interface HFRangeSet : NSObject <NSCopying, NSSecureCoding, NSFastEnumeration> {
487 CFMutableArrayRef array;
497 + (
HFRangeSet *)withRangeWrappers:(NSArray *)ranges;
505 - (void)addRange:(
HFRange)range;
506 - (void)removeRange:(
HFRange)range;
507 - (void)clipToRange:(
HFRange)range;
508 - (void)toggleRange:(
HFRange)range;
511 - (void)removeRangeSet:(
HFRangeSet *)rangeSet;
512 - (void)clipToRangeSet:(
HFRangeSet *)rangeSet;
513 - (void)toggleRangeSet:(
HFRangeSet *)rangeSet;
516 - (BOOL)isEqualToRangeSet:(
HFRangeSet *)rangeSet;
519 - (BOOL)containsAllRange:(
HFRange)range;
520 - (BOOL)overlapsAnyRange:(
HFRange)range;
521 - (BOOL)containsAllRangeSet:(
HFRangeSet *)rangeSet;
522 - (BOOL)overlapsAnyRangeSet:(
HFRangeSet *)rangeSet;
526 - (void)assertIntegrity;
uint8_t HFStringEncodingCharacterLength(NSStringEncoding encoding)
BOOL HFStringEncodingIsSupersetOfASCII(NSStringEncoding encoding)
unsigned long long length
Definition: HFTypes.h:4
HFRange is the 64 bit analog of NSRange, containing a 64 bit location and length. ...
Definition: HFTypes.h:2
An object wrapper for the HFRange type.
Definition: HFFunctions.h:455
void HFStartTiming(const char *name)
void HFRegisterViewForWindowAppearanceChanges(NSView *view, SEL notificationSEL, BOOL appToo)
A set of HFRanges. HFRangeSet takes the interpetation that all zero-length ranges are identical...
Definition: HFFunctions.h:482
NSString * HFDescribeByteCount(unsigned long long count)
long double location
Definition: HFTypes.h:11
long double length
Definition: HFTypes.h:12
unsigned long long location
Definition: HFTypes.h:3
HFFPRange is a struct used for representing floating point ranges, similar to NSRange. It contains two long doubles.
Definition: HFTypes.h:10
void HFDrawShadow(CGContextRef context, NSRect rect, CGFloat size, NSRectEdge rectEdge, BOOL active, NSRect clip)
void HFUnregisterViewForWindowAppearanceChanges(NSView *view, BOOL appToo)