blob: bcf0160bcdbe09b040fb707e35b83a4500fe2ad7 [file] [log] [blame]
/*
* 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.
*/
#ifndef _THRIFT_TUUID_H_
#define _THRIFT_TUUID_H_ 1
#include <thrift/Thrift.h>
#ifdef THRIFT_TUUID_SUPPORT_BOOST_UUID
#include <boost/uuid/uuid.hpp>
#endif // THRIFT_TUUID_SUPPORT_BOOST_UUID
#include <algorithm>
namespace apache {
namespace thrift {
/**
* Thrift wrapper class for a UUID type.
*
* The UUID is stored as a 16 byte buffer.
* This class stores the UUID in network order when assigned from a string.
*/
class TUuid {
public:
typedef uint8_t value_type;
typedef uint8_t* iterator;
typedef uint8_t const* const_iterator;
typedef std::size_t size_type;
typedef std::ptrdiff_t difference_type;
TUuid() = default;
TUuid(const TUuid& other) = default;
TUuid(TUuid&& other) = default;
TUuid& operator=(const TUuid&) = default;
TUuid& operator=(TUuid&&) = default;
~TUuid() = default;
/**
* Construct the object from a 16 byte buffer.
*/
explicit TUuid(const uint8_t (&data)[16]) noexcept
{
std::copy(std::begin(data), std::end(data), std::begin(this->data_));
}
/**
* Construct the object from the specified string.
*
* Supported string formats are:
* - "hhhhhhhh-hhhh-hhhh-hhhh-hhhhhhhhhhhh"
* - "{hhhhhhhh-hhhh-hhhh-hhhh-hhhhhhhhhhhh}"
* - "hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh"
* - "{hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh}"
*
* If the string is invalid, the object will be set to a
* nil (empty) UUID.
*/
explicit TUuid(const std::string& str) noexcept;
#ifdef THRIFT_TUUID_SUPPORT_BOOST_UUID
/**
* Construct the TUuid from a boost::uuids::uuid.
*
* This constructor will only be available if the <tt>THRIFT_TUUID_SUPPORT_BOOST_UUID</tt>
* compiler directive is set when this file is included.
*
* This constructor is by default implicit. It can be made explicit by defining the
* <tt>THRIFT_TUUID_BOOST_CONSTRUCTOR_EXPLICIT</tt> compiler directive.
*/
#ifdef THRIFT_TUUID_BOOST_CONSTRUCTOR_EXPLICIT
explicit
#endif // THRIFT_TUUID_BOOST_CONSTRUCTOR_EXPLICIT
TUuid(const boost::uuids::uuid& buuid) noexcept
{
std::copy(std::begin(buuid.data), std::end(buuid.data), std::begin(this->data_));
}
#endif // THRIFT_TUUID_SUPPORT_BOOST_UUID
/**
* Check if the UUID is nil.
*/
bool is_nil() const noexcept;
/**
* Compare two TUuid objects for equality.
*/
inline bool operator==(const TUuid& other) const;
/**
* Compare two TUuid objects for inequality.
*/
inline bool operator!=(const TUuid& other) const;
iterator begin() noexcept { return data_; }
const_iterator begin() const noexcept { return data_; }
iterator end() noexcept { return data_ + size(); }
const_iterator end() const noexcept { return data_ + size(); }
size_type size() const noexcept { return 16; }
inline const_iterator data() const { return data_; }
inline iterator data() { return data_; }
void swap(TUuid& other) noexcept { std::swap(data_, other.data_); }
private:
/**
* The UUID data.
*/
uint8_t data_[16] = {};
};
/**
* Get the String representation of a TUUID.
*
* The format returned is:
* - "hhhhhhhh-hhhh-hhhh-hhhh-hhhhhhhhhhhh"
*/
std::string to_string(const TUuid& uuid) noexcept(false);
/**
* Swap two TUuid objects
*/
inline void swap(TUuid& lhs, TUuid& rhs) noexcept {
lhs.swap(rhs);
}
/**
* TUuid equality comparison operator implementation
*/
inline bool TUuid::operator==(const TUuid& other) const {
// Compare using temporary strings.
// Can't use strcmp() since we expect embeded zeros
// Perhaps the reason we should use std::array instead
return std::string(this->begin(), this->end()) == std::string(other.begin(), other.end());
}
/**
* TUuid inequality comparison operator implementation
*/
inline bool TUuid::operator!=(const TUuid& other) const {
return !(*this == other);
}
/**
* TUuid ostream stream operator implementation
*/
inline std::ostream& operator<<(std::ostream& out, const TUuid& obj) {
out << to_string(obj);
return out;
}
} // namespace thrift
} // namespace apache
#endif // #ifndef _THRIFT_TUUID_H_