// Copyright 2017 The Abseil Authors. // // Licensed 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 // // https://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 ABSL_RANDOM_INTERNAL_SALTED_SEED_SEQ_H_ #define ABSL_RANDOM_INTERNAL_SALTED_SEED_SEQ_H_ #include <cstdint> #include <cstdlib> #include <initializer_list> #include <iterator> #include <memory> #include <type_traits> #include <utility> #include <vector> #include "absl/container/inlined_vector.h" #include "absl/meta/type_traits.h" #include "absl/random/internal/seed_material.h" #include "absl/types/optional.h" #include "absl/types/span.h" namespace absl { ABSL_NAMESPACE_BEGIN namespace random_internal { // This class conforms to the C++ Standard "Seed Sequence" concept // [rand.req.seedseq]. // // A `SaltedSeedSeq` is meant to wrap an existing seed sequence and modify // generated sequence by mixing with extra entropy. This entropy may be // build-dependent or process-dependent. The implementation may change to be // have either or both kinds of entropy. If salt is not available sequence is // not modified. template <typename SSeq> class SaltedSeedSeq { … }; // is_salted_seed_seq indicates whether the type is a SaltedSeedSeq. template <typename T, typename = void> struct is_salted_seed_seq : public std::false_type { … }; is_salted_seed_seq<T, typename std::enable_if<std::is_same<T, SaltedSeedSeq<typename T::inner_sequence_type>>::value>::type>; // MakeSaltedSeedSeq returns a salted variant of the seed sequence. // When provided with an existing SaltedSeedSeq, returns the input parameter, // otherwise constructs a new SaltedSeedSeq which embodies the original // non-salted seed parameters. template < typename SSeq, // typename EnableIf = absl::enable_if_t<is_salted_seed_seq<SSeq>::value>> SSeq MakeSaltedSeedSeq(SSeq&& seq) { … } template < typename SSeq, // typename EnableIf = absl::enable_if_t<!is_salted_seed_seq<SSeq>::value>> SaltedSeedSeq<typename std::decay<SSeq>::type> MakeSaltedSeedSeq(SSeq&& seq) { … } } // namespace random_internal ABSL_NAMESPACE_END } // namespace absl #endif // ABSL_RANDOM_INTERNAL_SALTED_SEED_SEQ_H_