diff options
author | Adrian Kummerlaender | 2016-04-30 20:06:48 +0200 |
---|---|---|
committer | Adrian Kummerlaender | 2016-04-30 20:06:48 +0200 |
commit | 05c4ee3665445eadf094ccab395518e992c337d4 (patch) | |
tree | 67fb9db0c5fece4a7cd18bd6aa46322e2bcbaeff /src | |
parent | 5eb3689c9985f28b46651f547b9b32d55b4a07b5 (diff) | |
download | justify-05c4ee3665445eadf094ccab395518e992c337d4.tar justify-05c4ee3665445eadf094ccab395518e992c337d4.tar.gz justify-05c4ee3665445eadf094ccab395518e992c337d4.tar.bz2 justify-05c4ee3665445eadf094ccab395518e992c337d4.tar.lz justify-05c4ee3665445eadf094ccab395518e992c337d4.tar.xz justify-05c4ee3665445eadf094ccab395518e992c337d4.tar.zst justify-05c4ee3665445eadf094ccab395518e992c337d4.zip |
Enables users to customize the seed used for the pseudorandom number generator.
Diffstat (limited to 'src')
-rw-r--r-- | src/line_accumulator.cc | 49 | ||||
-rw-r--r-- | src/line_accumulator.h | 11 |
2 files changed, 31 insertions, 29 deletions
diff --git a/src/line_accumulator.cc b/src/line_accumulator.cc index 9ce389b..a203fac 100644 --- a/src/line_accumulator.cc +++ b/src/line_accumulator.cc @@ -6,23 +6,17 @@ namespace { -static std::mt19937 generator; - std::uint8_t getRandomIndex( - const int seed, + std::mt19937& generator, const std::uint8_t n ) { - generator.seed(seed); - return std::uniform_int_distribution<std::uint8_t>{0, n}(generator); } std::vector<std::uint8_t> getRandomIndizes( - const int seed, - const std::uint8_t n + std::mt19937& generator, + const std::uint8_t n ) { - generator.seed(seed); - std::vector<std::uint8_t> indizes(n); std::iota(indizes.begin(), indizes.end(), 0); std::shuffle( @@ -55,11 +49,13 @@ std::size_t getCharacterLength(const std::string& token) { namespace justify { LineAccumulator::LineAccumulator( - const std::uint8_t max_length, - const std::uint8_t offset + const std::uint8_t max_length, + const std::uint8_t offset, + const std::uint32_t seed ): max_length_{max_length}, offset_{offset}, + generator_{seed}, length_{0}, tokens_{} { } @@ -67,14 +63,6 @@ LineAccumulator::~LineAccumulator() { this->discharge(false); } -std::uint8_t LineAccumulator::getMissing() const { - if ( this->length_ < this->max_length_ ) { - return this->max_length_ - this->length_; - } else { - return 0; - } -} - void LineAccumulator::operator()(const std::string& token) { const std::size_t tokenLength = getCharacterLength(token); @@ -91,10 +79,15 @@ void LineAccumulator::operator()(const std::string& token) { } } -void LineAccumulator::justify() { - const int seed = this->tokens_.size() - + this->getMissing(); +std::uint8_t LineAccumulator::getMissing() const { + if ( this->length_ < this->max_length_ ) { + return this->max_length_ - this->length_; + } else { + return 0; + } +} +void LineAccumulator::justify() { switch ( this->tokens_.size() ) { // There is no sensible block justification of null or any single token case 0: @@ -137,14 +130,18 @@ void LineAccumulator::justify() { } // randomly distribute missing spaces case 1: { - this->tokens_[ - getRandomIndex(seed, this->tokens_.size() - 2) - ].second += 1; + this->tokens_[getRandomIndex( + this->generator_, + this->tokens_.size() - 2 + )].second += 1; break; } default: { - const auto indizes = getRandomIndizes(seed, this->tokens_.size() - 2); + const auto indizes = getRandomIndizes( + this->generator_, + this->tokens_.size() - 2 + ); std::for_each( indizes.begin(), diff --git a/src/line_accumulator.h b/src/line_accumulator.h index 69b4c74..db75c8c 100644 --- a/src/line_accumulator.h +++ b/src/line_accumulator.h @@ -9,23 +9,28 @@ namespace justify { class LineAccumulator { public: - LineAccumulator(const std::uint8_t max_length, const std::uint8_t offset); + LineAccumulator( + const std::uint8_t max_length, + const std::uint8_t offset, + const std::uint32_t seed + ); ~LineAccumulator(); - std::uint8_t getMissing() const; - void operator()(const std::string& token); private: const std::uint8_t max_length_; const std::uint8_t offset_; + std::mt19937 generator_; std::uint8_t length_; std::vector< std::pair<std::string, std::uint8_t> > tokens_; + std::uint8_t getMissing() const; + void justify(); void discharge(const bool full); |