/* Metallurgy - Higher Level Interface to Chordata
 * Copyright (C) 2001-2002  Jay Freeman (saurik)
*/

/*
 *        Redistribution and use in source and binary
 * forms, with or without modification, are permitted
 * provided that the following conditions are met:
 * 
 * 1. Redistributions of source code must retain the
 *    above copyright notice, this list of conditions
 *    and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the
 *    above copyright notice, this list of conditions
 *    and the following disclaimer in the documentation
 *    and/or other materials provided with the
 *    distribution.
 * 3. The name of the author may not be used to endorse
 *    or promote products derived from this software
 *    without specific prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS''
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
 * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

#ifndef METALLURGY_ENUMERATION
#define METALLURGY_ENUMERATION

#define ENUMSTART(mdType, source, method) \
	TokenList tokens; \
\
	Chordata::CorEnum henum = NULL; \
	mdType datas[256]; \
	uint32_t count, total = 1; \
\
	while (S_OK == (*source)->method(&henum

#define ENUMEND(source, Type) datas, 256, &count) && count > 0) \
		for (uint32_t i(0); i < count; i++, total++) \
			tokens.insert(dynamic_cast<Type *>(source->ResolveToken(datas[i]))); \
\
	return tokens;


#define ENUMERATE0(mdType, source, method, Type) \
	ENUMSTART(mdType, source, method) , ENUMEND(source, Type)

#define ENUMERATE1(mdType, source, method, Type, arg1) \
	ENUMSTART(mdType, source, method), arg1, ENUMEND(source, Type)

#define ENUMERATE2(mdType, source, method, Type, arg1, arg2) \
	ENUMSTART(mdType, source, method), arg1, arg2, ENUMEND(source, Type)

#endif//METALLURGY_ENUMERATION