#
# 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.
#

# Uuid
qpid::types::Uuid::SIZE
qpid::types::Uuid::Uuid(bool)
qpid::types::Uuid::Uuid(qpid::types::Uuid const&)
qpid::types::Uuid::operator=(qpid::types::Uuid const&)
qpid::types::Uuid::Uuid(unsigned char const*)
qpid::types::Uuid::Uuid(char const*)
qpid::types::Uuid::generate()
qpid::types::Uuid::clear()
qpid::types::Uuid::isNull() const
qpid::types::Uuid::operator bool() const
qpid::types::Uuid::operator!() const
qpid::types::Uuid::str() const
qpid::types::Uuid::size() const
qpid::types::Uuid::data() const
qpid::types::Uuid::hash() const

qpid::types::operator==(qpid::types::Uuid const&, qpid::types::Uuid const&)
qpid::types::operator!=(qpid::types::Uuid const&, qpid::types::Uuid const&)
qpid::types::operator<(qpid::types::Uuid const&, qpid::types::Uuid const&)
qpid::types::operator>(qpid::types::Uuid const&, qpid::types::Uuid const&)
qpid::types::operator<=(qpid::types::Uuid const&, qpid::types::Uuid const&)
qpid::types::operator>=(qpid::types::Uuid const&, qpid::types::Uuid const&)
qpid::types::operator<<(std::ostream&, qpid::types::Uuid)
qpid::types::operator>>(std::istream&, qpid::types::Uuid&)

# VariantType
qpid::types::getTypeName(qpid::types::VariantType)
qpid::types::isIntegerType(qpid::types::VariantType)

# Variant
qpid::types::Variant::Variant()
qpid::types::Variant::Variant(bool)
qpid::types::Variant::Variant(uint8_t)
qpid::types::Variant::Variant(uint16_t)
qpid::types::Variant::Variant(uint32_t)
qpid::types::Variant::Variant(uint64_t)
qpid::types::Variant::Variant(int8_t)
qpid::types::Variant::Variant(int16_t)
qpid::types::Variant::Variant(int32_t)
qpid::types::Variant::Variant(int64_t)
qpid::types::Variant::Variant(float)
qpid::types::Variant::Variant(double)
qpid::types::Variant::Variant(std::string const&)
qpid::types::Variant::Variant(char const*)
qpid::types::Variant::Variant(qpid::types::Variant::Map const&)
qpid::types::Variant::Variant(qpid::types::Variant::List const&)
qpid::types::Variant::Variant(qpid::types::Variant const&)
qpid::types::Variant::Variant(qpid::types::Uuid const&)
qpid::types::Variant::~Variant()
qpid::types::Variant::getType() const
qpid::types::Variant::isVoid() const
qpid::types::Variant::operator=(bool)
qpid::types::Variant::operator=(uint8_t)
qpid::types::Variant::operator=(uint16_t)
qpid::types::Variant::operator=(uint32_t)
qpid::types::Variant::operator=(uint64_t)
qpid::types::Variant::operator=(int8_t)
qpid::types::Variant::operator=(int16_t)
qpid::types::Variant::operator=(int32_t)
qpid::types::Variant::operator=(int64_t)
qpid::types::Variant::operator=(float)
qpid::types::Variant::operator=(double)
qpid::types::Variant::operator=(std::string const&)
qpid::types::Variant::operator=(char const*)
qpid::types::Variant::operator=(qpid::types::Variant::Map const&)
qpid::types::Variant::operator=(qpid::types::Variant::List const&)
qpid::types::Variant::operator=(qpid::types::Variant const&)
qpid::types::Variant::operator=(qpid::types::Uuid const&)
qpid::types::Variant::parse(std::string const&)
qpid::types::Variant::asBool() const
qpid::types::Variant::asUint8() const
qpid::types::Variant::asUint16() const
qpid::types::Variant::asUint32() const
qpid::types::Variant::asUint64() const
qpid::types::Variant::asInt8() const
qpid::types::Variant::asInt16() const
qpid::types::Variant::asInt32() const
qpid::types::Variant::asInt64() const
qpid::types::Variant::asFloat() const
qpid::types::Variant::asDouble() const
qpid::types::Variant::asString() const
qpid::types::Variant::asUuid() const
qpid::types::Variant::asMap() const
qpid::types::Variant::asMap()
qpid::types::Variant::asList() const
qpid::types::Variant::asList()
qpid::types::Variant::getString() const
qpid::types::Variant::getString()
qpid::types::Variant::setEncoding(std::string const&)
qpid::types::Variant::getEncoding() const
qpid::types::Variant::operator bool() const
qpid::types::Variant::operator uint8_t() const
qpid::types::Variant::operator uint16_t() const
qpid::types::Variant::operator uint32_t() const
qpid::types::Variant::operator uint64_t() const
qpid::types::Variant::operator int8_t() const
qpid::types::Variant::operator int16_t() const
qpid::types::Variant::operator int32_t() const
qpid::types::Variant::operator int64_t() const
qpid::types::Variant::operator float() const
qpid::types::Variant::operator double() const
qpid::types::Variant::operator std::string() const
qpid::types::Variant::operator qpid::types::Uuid() const
qpid::types::Variant::isEqualTo(qpid::types::Variant const&) const
qpid::types::Variant::reset()

qpid::types::operator<<(std::ostream&, qpid::types::Variant const&)
qpid::types::operator<<(std::ostream&, qpid::types::Variant::Map const&)
qpid::types::operator<<(std::ostream&, qpid::types::Variant::List const&)
qpid::types::operator==(qpid::types::Variant const&, qpid::types::Variant const&)
qpid::types::operator!=(qpid::types::Variant const&, qpid::types::Variant const&)

# Root of qpid::types Exception hierarchy
qpid::types::Exception::Exception(std::string const&)
qpid::types::Exception::~Exception()
qpid::types::Exception::what() const

qpid::types::InvalidConversion::InvalidConversion(std::string const&)
qpid::types::InvalidConversion::~InvalidConversion()


