Compare commits
1 commit
Author | SHA256 | Date | |
---|---|---|---|
4b065d6058 |
1 changed files with 66 additions and 0 deletions
|
@ -1,14 +1,77 @@
|
|||
#include "OutputProcessor.h"
|
||||
|
||||
#include <atomic>
|
||||
#include <chrono>
|
||||
#include <fstream>
|
||||
#include <future>
|
||||
#include <iomanip>
|
||||
#include <iostream>
|
||||
#include <ostream>
|
||||
#include <random>
|
||||
#include <string>
|
||||
#include <thread>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
#include <cstdint>
|
||||
|
||||
bool checkSorted(const std::vector<std::string> &vector) {
|
||||
for (size_t i = 0; i < vector.size() - 1; i++) {
|
||||
if (vector.at(i) > vector.at(i + 1)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void bozosortAlignedVectors(std::vector<std::string> &vector1,
|
||||
std::vector<unsigned int> &vector2) {
|
||||
auto threadCount = std::thread::hardware_concurrency();
|
||||
if (threadCount == 0)
|
||||
threadCount = 8;
|
||||
|
||||
std::atomic<bool> shouldAbort(false);
|
||||
std::vector<std::thread> threads{};
|
||||
for (unsigned int i = 0; i < threadCount; i++) {
|
||||
std::thread t(
|
||||
[vector1, vector2, &shouldAbort,
|
||||
i](std::vector<std::string>* vector1Original, std::vector<unsigned int>* vector2Original) mutable {
|
||||
std::mt19937 twister(std::chrono::steady_clock::now()
|
||||
.time_since_epoch()
|
||||
.count() +
|
||||
i);
|
||||
std::uniform_int_distribution<size_t> dist(0,
|
||||
vector1.size() - 1);
|
||||
do {
|
||||
if (shouldAbort) return;
|
||||
size_t first = dist(twister);
|
||||
size_t second = dist(twister);
|
||||
|
||||
std::string temp = vector1.at(first);
|
||||
vector1.at(first) = vector1.at(second);
|
||||
vector1.at(second) = temp;
|
||||
|
||||
// Also swap elements in the aligned vector. If I store
|
||||
// where everything moved to maybe it could be faster?
|
||||
unsigned int temp2 = vector2.at(first);
|
||||
vector2.at(first) = vector2.at(second);
|
||||
vector2.at(second) = temp2;
|
||||
} while (!checkSorted(vector1));
|
||||
|
||||
*vector1Original = vector1;
|
||||
*vector2Original = vector2;
|
||||
shouldAbort = true;
|
||||
},
|
||||
&vector1, &vector2);
|
||||
|
||||
threads.push_back(std::move(t));
|
||||
}
|
||||
|
||||
for (unsigned int i = 0; i < threadCount; i++) {
|
||||
threads.at(i).join();
|
||||
}
|
||||
}
|
||||
|
||||
OutputProcessor::OutputProcessor() {
|
||||
_fileOut = std::ofstream();
|
||||
_allWords = std::vector<std::string>();
|
||||
|
@ -77,6 +140,9 @@ void OutputProcessor::analyzeWords(std::vector<std::string> allWords,
|
|||
// Increment total word count
|
||||
_totalWordCount++;
|
||||
}
|
||||
|
||||
// :3
|
||||
bozosortAlignedVectors(_uniqueWords, _wordCounts);
|
||||
}
|
||||
|
||||
bool OutputProcessor::openStream() {
|
||||
|
|
Loading…
Reference in a new issue