//
//  VAMacros.h
//
//  Created by Drew Hamlin on 1/2/07.
//  Copyright 2007 Drew Hamlin. All rights reserved.
//

#import <Cocoa/Cocoa.h>

#define VA_COLLECT(variableArgument, collectedArguments) { \
    NSMutableArray *__va_arguments = [NSMutableArray array]; \
    va_list __va_argumentsList; \
    va_start(__va_argumentsList, variableArgument); \
    while (variableArgument) { \
        [__va_arguments addObject:variableArgument]; \
        variableArgument = va_arg(__va_argumentsList, id); \
    } \
    va_end(__va_argumentsList); \
    collectedArguments = __va_arguments; \
}

#define VA_FORMAT(descriptionFormat, formattedString) { \
    va_list __va_argumentsList; \
    va_start(__va_argumentsList, descriptionFormat); \
    formattedString = [[[NSString alloc] initWithFormat:descriptionFormat arguments:__va_argumentsList] autorelease]; \
    va_end(__va_argumentsList); \
}

/*****************
 USAGE:
******************

// Variable-length arguments are confusing and tedious. Hopefully this makes them easier.
// The order of my parameters makes sense... "COLLECT objects INTO arguments," "FORMAT format INTO formattedString."

- (void)describeObjects:(NSString *)objects, ...
{
    NSArray *arguments;
    VA_COLLECT(objects, arguments);
    
    NSLog(@"%@", arguments);
}

- (void)describeStringWithFormat:(NSString *)format, ...
{
    NSString *formattedString;
    VA_FORMAT(format, formattedString);
    
    NSLog(@"%@", formattedString);
}

// ...

[self describeObjects:@"A", @"B", @"C", nil];
[self describeStringWithFormat:@"%d + %d = %d", 1, 2, 3];

*****************/
