refactor: move (object/content) components out
This commit is contained in:
parent
1b630bc07f
commit
c8619561ec
@ -54,6 +54,9 @@ add_library(solanaceae_sha1_ngcft1
|
|||||||
./solanaceae/ngc_ft1_sha1/ft1_sha1_info.hpp
|
./solanaceae/ngc_ft1_sha1/ft1_sha1_info.hpp
|
||||||
./solanaceae/ngc_ft1_sha1/ft1_sha1_info.cpp
|
./solanaceae/ngc_ft1_sha1/ft1_sha1_info.cpp
|
||||||
|
|
||||||
|
./solanaceae/ngc_ft1_sha1/components.hpp
|
||||||
|
./solanaceae/ngc_ft1_sha1/components.cpp
|
||||||
|
|
||||||
./solanaceae/ngc_ft1_sha1/sha1_ngcft1.hpp
|
./solanaceae/ngc_ft1_sha1/sha1_ngcft1.hpp
|
||||||
./solanaceae/ngc_ft1_sha1/sha1_ngcft1.cpp
|
./solanaceae/ngc_ft1_sha1/sha1_ngcft1.cpp
|
||||||
)
|
)
|
||||||
|
25
solanaceae/ngc_ft1_sha1/components.cpp
Normal file
25
solanaceae/ngc_ft1_sha1/components.cpp
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
#include "./components.hpp"
|
||||||
|
|
||||||
|
std::vector<size_t> Components::FT1ChunkSHA1Cache::chunkIndices(const SHA1Digest& hash) const {
|
||||||
|
const auto it = chunk_hash_to_index.find(hash);
|
||||||
|
if (it != chunk_hash_to_index.cend()) {
|
||||||
|
return it->second;
|
||||||
|
} else {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Components::FT1ChunkSHA1Cache::haveChunk(const SHA1Digest& hash) const {
|
||||||
|
if (have_all) { // short cut
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (auto i_vec = chunkIndices(hash); !i_vec.empty()) {
|
||||||
|
// TODO: should i test all?
|
||||||
|
return have_chunk[i_vec.front()];
|
||||||
|
}
|
||||||
|
|
||||||
|
// not part of this file
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
66
solanaceae/ngc_ft1_sha1/components.hpp
Normal file
66
solanaceae/ngc_ft1_sha1/components.hpp
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <solanaceae/contact/components.hpp>
|
||||||
|
#include <solanaceae/message3/components.hpp>
|
||||||
|
#include <solanaceae/message3/registry_message_model.hpp>
|
||||||
|
|
||||||
|
#include <entt/container/dense_set.hpp>
|
||||||
|
|
||||||
|
#include "./ft1_sha1_info.hpp"
|
||||||
|
#include "./hash_utils.hpp"
|
||||||
|
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
|
||||||
|
// TODO: rename to object components
|
||||||
|
namespace Components {
|
||||||
|
|
||||||
|
struct Messages {
|
||||||
|
std::vector<Message3Handle> messages;
|
||||||
|
};
|
||||||
|
|
||||||
|
using FT1InfoSHA1 = FT1InfoSHA1;
|
||||||
|
|
||||||
|
struct FT1InfoSHA1Data {
|
||||||
|
std::vector<uint8_t> data;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct FT1InfoSHA1Hash {
|
||||||
|
std::vector<uint8_t> hash;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct FT1ChunkSHA1Cache {
|
||||||
|
std::vector<bool> have_chunk;
|
||||||
|
bool have_all {false};
|
||||||
|
size_t have_count {0};
|
||||||
|
entt::dense_map<SHA1Digest, std::vector<size_t>> chunk_hash_to_index;
|
||||||
|
|
||||||
|
std::vector<size_t> chunkIndices(const SHA1Digest& hash) const;
|
||||||
|
bool haveChunk(const SHA1Digest& hash) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct FT1ChunkSHA1Requested {
|
||||||
|
// requested chunks with a timer since last request
|
||||||
|
entt::dense_map<size_t, float> chunks;
|
||||||
|
};
|
||||||
|
|
||||||
|
// TODO: once announce is shipped, remove the "Suspected"
|
||||||
|
struct SuspectedParticipants {
|
||||||
|
entt::dense_set<Contact3> participants;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ReRequestInfoTimer {
|
||||||
|
float timer {0.f};
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ReadHeadHint {
|
||||||
|
// points to the first byte we want
|
||||||
|
// this is just a hint, that can be set from outside
|
||||||
|
// to guide the sequential "piece picker" strategy
|
||||||
|
// the strategy *should* set this to the first byte we dont yet have
|
||||||
|
uint64_t offset_into_file {0u};
|
||||||
|
};
|
||||||
|
|
||||||
|
} // Components
|
||||||
|
|
@ -16,6 +16,8 @@
|
|||||||
|
|
||||||
#include "./file_rw_mapped.hpp"
|
#include "./file_rw_mapped.hpp"
|
||||||
|
|
||||||
|
#include "./components.hpp"
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <variant>
|
#include <variant>
|
||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
@ -29,80 +31,6 @@ namespace Message::Components {
|
|||||||
|
|
||||||
} // Message::Components
|
} // Message::Components
|
||||||
|
|
||||||
// TODO: rename to object components
|
|
||||||
namespace Components {
|
|
||||||
|
|
||||||
struct Messages {
|
|
||||||
std::vector<Message3Handle> messages;
|
|
||||||
};
|
|
||||||
|
|
||||||
using FT1InfoSHA1 = FT1InfoSHA1;
|
|
||||||
|
|
||||||
struct FT1InfoSHA1Data {
|
|
||||||
std::vector<uint8_t> data;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct FT1InfoSHA1Hash {
|
|
||||||
std::vector<uint8_t> hash;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct FT1ChunkSHA1Cache {
|
|
||||||
std::vector<bool> have_chunk;
|
|
||||||
bool have_all {false};
|
|
||||||
size_t have_count {0};
|
|
||||||
entt::dense_map<SHA1Digest, std::vector<size_t>> chunk_hash_to_index;
|
|
||||||
|
|
||||||
std::vector<size_t> chunkIndices(const SHA1Digest& hash) const;
|
|
||||||
bool haveChunk(const SHA1Digest& hash) const;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct FT1ChunkSHA1Requested {
|
|
||||||
// requested chunks with a timer since last request
|
|
||||||
entt::dense_map<size_t, float> chunks;
|
|
||||||
};
|
|
||||||
|
|
||||||
// TODO: once announce is shipped, remove the "Suspected"
|
|
||||||
struct SuspectedParticipants {
|
|
||||||
entt::dense_set<Contact3> participants;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ReRequestInfoTimer {
|
|
||||||
float timer {0.f};
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ReadHeadHint {
|
|
||||||
// points to the first byte we want
|
|
||||||
// this is just a hint, that can be set from outside
|
|
||||||
// to guide the sequential "piece picker" strategy
|
|
||||||
// the strategy *should* set this to the first byte we dont yet have
|
|
||||||
uint64_t offset_into_file {0u};
|
|
||||||
};
|
|
||||||
|
|
||||||
} // Components
|
|
||||||
|
|
||||||
std::vector<size_t> Components::FT1ChunkSHA1Cache::chunkIndices(const SHA1Digest& hash) const {
|
|
||||||
const auto it = chunk_hash_to_index.find(hash);
|
|
||||||
if (it != chunk_hash_to_index.cend()) {
|
|
||||||
return it->second;
|
|
||||||
} else {
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Components::FT1ChunkSHA1Cache::haveChunk(const SHA1Digest& hash) const {
|
|
||||||
if (have_all) { // short cut
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (auto i_vec = chunkIndices(hash); !i_vec.empty()) {
|
|
||||||
// TODO: should i test all?
|
|
||||||
return have_chunk[i_vec.front()];
|
|
||||||
}
|
|
||||||
|
|
||||||
// not part of this file
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
static size_t chunkSize(const FT1InfoSHA1& sha1_info, size_t chunk_index) {
|
static size_t chunkSize(const FT1InfoSHA1& sha1_info, size_t chunk_index) {
|
||||||
if (chunk_index+1 == sha1_info.chunks.size()) {
|
if (chunk_index+1 == sha1_info.chunks.size()) {
|
||||||
// last chunk
|
// last chunk
|
||||||
|
Loading…
Reference in New Issue
Block a user