summaryrefslogtreecommitdiff
path: root/boost/uuid/detail/random_provider.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/uuid/detail/random_provider.hpp')
-rw-r--r--boost/uuid/detail/random_provider.hpp75
1 files changed, 75 insertions, 0 deletions
diff --git a/boost/uuid/detail/random_provider.hpp b/boost/uuid/detail/random_provider.hpp
new file mode 100644
index 0000000000..03d8f26f95
--- /dev/null
+++ b/boost/uuid/detail/random_provider.hpp
@@ -0,0 +1,75 @@
+//
+// Copyright (c) 2017 James E. King III
+//
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENCE_1_0.txt)
+//
+// Platform-specific random entropy provider
+//
+
+#ifndef BOOST_UUID_DETAIL_RANDOM_PROVIDER_HPP
+#define BOOST_UUID_DETAIL_RANDOM_PROVIDER_HPP
+
+#include <boost/core/noncopyable.hpp>
+#include <boost/cstdint.hpp>
+#include <boost/limits.hpp>
+#include <boost/static_assert.hpp>
+#include <boost/type_traits/is_integral.hpp>
+#include <boost/type_traits/is_unsigned.hpp>
+#include <boost/uuid/entropy_error.hpp>
+#include <climits>
+#include <iterator>
+
+// Detection of the platform is separated from inclusion of the correct
+// header to facilitate mock testing of the provider implementations.
+
+#include <boost/uuid/detail/random_provider_detect_platform.hpp>
+#include <boost/uuid/detail/random_provider_include_platform.hpp>
+
+
+namespace boost {
+namespace uuids {
+namespace detail {
+
+//! \brief Contains code common to all random_provider implementations.
+//! \note random_provider_base is required to provide this method:
+//! void get_random_bytes(void *buf, size_t siz);
+//! \note noncopyable because of some base implementations so
+//! this makes it uniform across platforms to avoid any
+//! porting surprises
+class random_provider
+ : public detail::random_provider_base,
+ public noncopyable
+{
+public:
+ //! Leverage the provider as a SeedSeq for
+ //! PseudoRandomNumberGeneration seeing.
+ //! \note: See Boost.Random documentation for more details
+ template<class Iter>
+ void generate(Iter first, Iter last)
+ {
+ typedef typename std::iterator_traits<Iter>::value_type value_type;
+ BOOST_STATIC_ASSERT(is_integral<value_type>::value);
+ BOOST_STATIC_ASSERT(is_unsigned<value_type>::value);
+ BOOST_STATIC_ASSERT(sizeof(value_type) * CHAR_BIT >= 32);
+
+ for (; first != last; ++first)
+ {
+ get_random_bytes(&*first, sizeof(*first));
+ *first &= (std::numeric_limits<boost::uint32_t>::max)();
+ }
+ }
+
+ //! Return the name of the selected provider
+ const char * name() const
+ {
+ return BOOST_UUID_RANDOM_PROVIDER_STRINGIFY(BOOST_UUID_RANDOM_PROVIDER_NAME);
+ }
+};
+
+} // detail
+} // uuids
+} // boost
+
+#endif // BOOST_UUID_DETAIL_RANDOM_PROVIDER_HPP