/// 'require(X)' is used to indicate parameter-related preconditions that callers must satisfy.
/// Failure to satisfy indicates a bug in the caller.
#define require(expr) if (!(expr)) [BadArgument raise:[NSString stringWithFormat:@"require %@ (in %s at line %d)", (@#expr), __FILE__, __LINE__]]
#define require(expr) if (!(expr)){ NSString *reason = [NSString stringWithFormat:@"require %@ (in %s at line %d)", (@#expr), __FILE__, __LINE__]; DDLogError(@"%@", reason);[BadArgument raise:reason];};
/// 'requireState(X)' is used to indicate callee-state-related preconditions that callers must satisfy.
/// Failure to satisfy indicates a stateful bug in either the caller or the callee.
@ -14,7 +14,7 @@
/// 'checkOperation(X)' is used to throw exceptions if operations fail.
/// Failure does not indicate a bug.
/// Methods may throw these exceptions for callers to catch as a 'returned error' result.
#define checkOperation(expr) if (!(expr)) [OperationFailed raise:[NSString stringWithFormat:@"Operation failed. Expected: %@(in %s at line %d)", (@#expr),__FILE__,__LINE__]]
#define checkOperation(expr) if (!(expr)){ NSString *reason = [NSString stringWithFormat:@"Operation failed. Expected: %@(in %s at line %d)", (@#expr),__FILE__,__LINE__];[OperationFailed raise:reason];}
/// 'checkOperationDescribe(X, Desc)' is used to throw exceptions if operations fail, and describe the problem.