|
Boost : |
Subject: [boost] [uuid] Interface
From: Andy Tompkins (atompkins_at_[hidden])
Date: 2008-12-12 11:44:48
Here is what I see the interface looking like based on feedback
from the review so far. It would, of course, be split into
different header files.
namespace boost {
namespace uuids {
class uuid : boost::totally_ordered<uuid>
{
// no default constructor
private:
uuid();
public:
typedef ... value_type; // will only represent one octet
typedef ... iterator;
typedef ... const_iterator;
typedef ... difference_type;
typedef ... size_type;
enum variant_type {
variant_unknown,
variant_ncs,
variant_rfc_4122,
variant_microsoft
};
enum version_type {
version_unknown,
version_1 = 1,
version_2 = 2,
version_3 = 3,
version_4 = 4,
version_5 = 5,
version_time_based = version_1,
version_dce_security = version_2,
version_name_based_md5 = version_3,
version_random_number_based = version_4
version_name_based_sha1 = version_4
};
public:
// valid expression
// generator() - result type must be convertible to a uuid
template <typename Generator>
explicit uuid(Generator & generator);
// assert(std::distance(begin, end) >= 16);
template <typename ByteInputIterator>
uuid(ByteInputIterator begin, ByteInputIterator end);
iterator begin();
iterator end();
const_iterator begin() const;
const_iterator end() const;
bool is_nil() const;
operator unspecified_bool_type() const; // return !is_nil();
static size_type size(); // always return 16
bool operator==(uuid const& rhs) const;
bool operator<(uuid const& rhs) const;
variant_type variant() const;
version_type version() const;
};
void swap(uuid & lhs, uuid & rhs);
std::size_t hash_value(uuid const& u);
// removed get/set_showbraces (does anybody want/use them?)
template <typename ch, typename char_traits>
std::basic_ostream<ch, char_traits>& operator<<(std::basic_ostream<ch,
char_traits>& os, uuid const& u);
template <typename ch, typename char_traits>
std::basic_istream<ch, char_traits>& operator>>(std::basic_istream<ch,
char_traits>& os, uuid& u);
class nil_generator // always generates a nil uuid
{
public:
typedef uuid result_type;
uuid operator()();
};
uuid nil(); // easy to use function - should it be included?
template <typename RandomGenerator = boost::mt19937>
class random_generator
{
public:
typedef uuid result_type;
random_generator();
explicit random_generator(RandomGenerator & gen);
explicit random_generator(RandomGenerator * gen);
uuid operator()();
};
// I guess technically a transformer since it does not have a zero
argument
// operator()
class name_based_generator // uses sha1 hash
{
public:
typedef uuid result_type;
explicit name_based_generator(uuid const& namespace_uuid);
template <typename ch, typename char_traits, typename allocator>
uuid operator()(std::basic_string<ch, char_traits, allocator> const&
name);
uuid operator()(const char* name); // use std::strlen
uuid operator()(const wchar_t* name); // use std::wcslen
template <typename ByteInputIterator>
uuid operator()(ByteInputIterator begin, ByteInputIterator end);
};
class windows_generator // uses UuidCreate
{
public:
typedef uuid result_type;
uuid operator()();
};
class linux_generator // used uuid_generate
{
public:
typedef uuid result_type;
uuid operator()();
};
// on windows - will typedef to windows_generator
// on linux - will typedef to linix_generator
typedef ... native_generator;
} //namespace uuids
using uuids::uuid; // so nobody has to type boost::uuids::uuid
} //namespace boost
BOOST_CLASS_IMPLEMENTATION(boost::uuids::uuid,
boost::serialization::primitive_type)
/*
uuid Generator concept
Notation:
X - a type that is a model of uuid generator
x - an object of type X
Associated Types:
Result Type - X::result_type - this must be convertable to
boost::uuids::uuid
Valid Expressions:
x() - return a boost::uuids::uuid
*/
Regards,
Andy Tompkins
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk