How would you define a simple "min" method in obj-c How would you define a simple "min" method in obj-c objective-c objective-c

How would you define a simple "min" method in obj-c


It is already defined as a macro.

MIN(a, b)MAX(a, b)

You dont need to redefine these ones.


There's a serious issue with the solution posted by Brandon Bodnár (which by the time of this writing is marked as a valid solution).

Issue described here: http://gcc.gnu.org/onlinedocs/gcc-3.4.6/gcc/Min-and-Max.htmlAnd the (valid & secure) solution to it: http://gcc.gnu.org/onlinedocs/gcc-3.4.6/gcc/Typeof.html

Check it out yourself:

#include <stdio.h>#define NAIVE_MAX(a,b) (a > b ? a : b)#define NAIVE_MIN(a,b) (a < b ? a : b)#if !defined MAX#define MAX(a,b) \({ __typeof__ (a) __a = (a); \__typeof__ (b) __b = (b); \__a > __b ? __a : __b; })#endif#if !defined MIN#define MIN(a,b) \({ __typeof__ (a) __a = (a); \__typeof__ (b) __b = (b); \__a < __b ? __a : __b; })#endifint main (int argc, const char * argv[]) {    int a = 3;    int b = 5;#pragma mark NON-FATAL CASES:    printf("NAIVE_MAX(%d, %d) => %d\n", a, b, NAIVE_MAX(a, b));    printf("NAIVE_MIN(%d, %d) => %d\n", a, b, NAIVE_MIN(a, b));    printf("MAX(%d, %d) => %d\n", a, b, MAX(a, b));    printf("MIN(%d, %d) => %d\n", a, b, MIN(a, b));    printf("\nEverything fine so far...\n\n");#pragma mark FATAL CASES:    //cache:    int _a = a;    int _b = b;    printf("NAIVE_MAX(%d++, %d++) => %d\n", _a, _b, NAIVE_MAX(a++, b++));    //reset:    a = _a;    b = _b;    printf("NAIVE_MIN(%d++, %d++) => %d\n", _a, _b, NAIVE_MIN(a++, b++));    //reset:    a = _a;    b = _b;    printf("NAIVE_MAX(++%d, ++%d) => %d\n", _a, _b, NAIVE_MAX(++a, ++b));    //reset:    a = _a;    b = _b;    printf("NAIVE_MIN(++%d, ++%d) => %d\n", _a, _b, NAIVE_MIN(++a, ++b));    printf("\nOuch, this doesn't look right at all!\n\n");#pragma mark NON-FATAL CASES:    //reset:    a = _a;    b = _b;    printf("MAX(%d++, %d++) => %d\n", _a, _b, MAX(a++, b++));    //reset:    a = _a;    b = _b;    printf("MIN(%d++, %d++) => %d\n", _a, _b, MIN(a++, b++));    //reset:    a = _a;    b = _b;    printf("MAX(++%d, ++%d) => %d\n", _a, _b, MAX(++a, ++b));    //reset:    a = _a;    b = _b;    printf("MIN(++%d, ++%d) => %d\n", _a, _b, MIN(++a, ++b));    printf("\nAh, much better now.\n\n");    return 0;}

Console log:

NAIVE_MAX(3, 5) => 5NAIVE_MIN(3, 5) => 3MAX(3, 5) => 5MIN(3, 5) => 3Everything fine so far...NAIVE_MAX(3++, 5++) => 6NAIVE_MIN(3++, 5++) => 4NAIVE_MAX(++3, ++5) => 7NAIVE_MIN(++3, ++5) => 5Ouch, this doesn't look right at all!MAX(3++, 5++) => 5MIN(3++, 5++) => 3MAX(++3, ++5) => 6MIN(++3, ++5) => 4Ah, much better now.

So never ever use the naive implementation as seen in the code above (and as suggested by Brandon Bodnár, sorry buddy ;) ) if you want to avoid worst cases like these.


Since you aren't using the OS X Implementation of objective-c, you may not have access to the predefined MIN and MAX macros.

You can define these yourself as

#define MIN(a,b)    ((a) < (b) ? (a) : (b))#define MAX(a,b)    ((a) > (b) ? (a) : (b))

There is probably a better way to define them, but these will create the simple macros for your use. You can add them into any common .h file that your classes normally share.