&{AMQP_MethodVersionMap.h}
/*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
 */

/*
 * This file is auto-generated by ${GENERATOR} - do not modify.
 * Supported AMQP versions:
%{VLIST} *   ${major}-${minor}
 */

#ifndef qpid_framing_AMQP_MethodVersionMap__
#define qpid_framing_AMQP_MethodVersionMap__

#include <map>
#include <AMQMethodBody.h>

%{MLIST} ${mc_method_body_include}

namespace qpid
{
namespace framing
{

template <class T> AMQMethodBody* createMethodBodyFn(u_int8_t major, u_int8_t minor) { return new T(major, minor); }
typedef AMQMethodBody* (*fnPtr)(u_int8_t, u_int8_t);

class AMQP_MethodVersionMap: public std::map<u_int64_t, fnPtr>
{
protected:
	u_int64_t createMapKey(u_int16_t classId, u_int16_t methodId, u_int8_t major, u_int8_t minor);
public:
	AMQP_MethodVersionMap();
	AMQMethodBody* createMethodBody(u_int16_t classId, u_int16_t methodId, u_int8_t major, u_int8_t minor);
};

} /* namespace framing */
} /* namespace qpid */

#endif
