pmt: Improve libpartition_map types and some functions.

- Add new operators to Map_t.
 - Add new flags to info function.
 - Move some local pmt function(s) to libhelper.
 - Etc...
This commit is contained in:
2025-09-07 11:56:12 +03:00
parent 1984825dec
commit 77760bd1d4
8 changed files with 51 additions and 21 deletions

View File

@@ -42,6 +42,18 @@ INIT {
"Print info(s) as JSON body. The body of each partition will " "Print info(s) as JSON body. The body of each partition will "
"be written separately") "be written separately")
->default_val(false); ->default_val(false);
cmd->add_flag("--as-byte", asByte,
"View sizes as byte.")
->default_val(true);
cmd->add_flag("--as-kilobyte", asKiloBytes,
"View sizes as kilobyte.")
->default_val(false);
cmd->add_flag("--as-megabyte", asMega,
"View sizes as megabyte.")
->default_val(false);
cmd->add_flag("--as-gigabyte", asGiga,
"View sizes as gigabyte.")
->default_val(false);
cmd->add_option("--json-partition-name", jNamePartition, cmd->add_option("--json-partition-name", jNamePartition,
"Specify partition name element for JSON body") "Specify partition name element for JSON body")
->default_val("name"); ->default_val("name");
@@ -59,7 +71,13 @@ INIT {
RUN { RUN {
std::vector<PartitionMap::Partition_t> jParts; std::vector<PartitionMap::Partition_t> jParts;
auto func = [this, &jParts] COMMON_LAMBDA_PARAMS -> bool { std::string multiple;
if (asByte) multiple = "B";
if (asKiloBytes) multiple = "KB";
if (asMega) multiple = "MB";
if (asGiga) multiple = "GB";
auto func = [this, &jParts, &multiple] COMMON_LAMBDA_PARAMS -> bool {
if (VARS.onLogical && !props.isLogical) { if (VARS.onLogical && !props.isLogical) {
if (VARS.forceProcess) if (VARS.forceProcess)
LOGN(IFUN, WARNING) LOGN(IFUN, WARNING)
@@ -72,14 +90,10 @@ RUN {
} }
if (jsonFormat) if (jsonFormat)
jParts.push_back({partition, {props.size, props.isLogical}}); jParts.push_back({partition, {std::stoull(Helper::convertTo(props.size, multiple)), props.isLogical}});
else else
#ifdef __LP64__ println("partition=%s size=%s isLogical=%s",
println("partition=%s size=%lu isLogical=%s", partition.data(), Helper::convertTo(props.size, multiple).data(), props.isLogical ? "true" : "false");
#else
println("partition=%s size=%llu isLogical=%s",
#endif
partition.data(), props.size, props.isLogical ? "true" : "false");
return true; return true;
}; };
@@ -94,6 +108,7 @@ RUN {
if (jsonFormat) { if (jsonFormat) {
nlohmann::json j; nlohmann::json j;
j["multipleType"] = multiple;
j["partitions"] = nlohmann::json::array(); j["partitions"] = nlohmann::json::array();
for (const auto &[name, props] : jParts) { for (const auto &[name, props] : jParts) {
j["partitions"].push_back({{jNamePartition, name}, j["partitions"].push_back({{jNamePartition, name},

View File

@@ -20,13 +20,6 @@ Copyright 2025 Yağız Zengin
#define SFUN "partitionSizeFunction" #define SFUN "partitionSizeFunction"
#define FUNCTION_CLASS partitionSizeFunction #define FUNCTION_CLASS partitionSizeFunction
static std::string convertTo(const uint64_t size, const std::string &multiple) {
if (multiple == "KB") return std::to_string(TO_KB(size));
if (multiple == "MB") return std::to_string(TO_MB(size));
if (multiple == "GB") return std::to_string(TO_GB(size));
return std::to_string(size);
}
namespace PartitionManager { namespace PartitionManager {
INIT { INIT {
LOGN(SFUN, INFO) LOGN(SFUN, INFO)
@@ -79,10 +72,10 @@ RUN {
if (asMega) multiple = "MB"; if (asMega) multiple = "MB";
if (asGiga) multiple = "GB"; if (asGiga) multiple = "GB";
if (onlySize) println("%s", convertTo(props.size, multiple).data()); if (onlySize) println("%s", Helper::convertTo(props.size, multiple).data());
else else
println("%s: %s%s", partition.data(), println("%s: %s%s", partition.data(),
convertTo(props.size, multiple).data(), multiple.data()); Helper::convertTo(props.size, multiple).data(), multiple.data());
return true; return true;
}; };

View File

@@ -99,7 +99,8 @@ private:
std::vector<std::string> partitions; std::vector<std::string> partitions;
std::string jNamePartition, jNameSize, jNameLogical; std::string jNamePartition, jNameSize, jNameLogical;
int jIndentSize = 2; int jIndentSize = 2;
bool jsonFormat = false; bool jsonFormat = false, asByte = true, asKiloBytes = false, asMega = false,
asGiga = false;
public: public:
COMMON_FUNCTION_BODY(); COMMON_FUNCTION_BODY();

View File

@@ -324,6 +324,11 @@ std::string pathDirname(std::string_view entry);
*/ */
uint64_t getRandomOffset(uint64_t size, uint64_t bufferSize); uint64_t getRandomOffset(uint64_t size, uint64_t bufferSize);
/**
* Convert input size to input multiple
*/
std::string convertTo(uint64_t size, const std::string &multiple);
// ------------------------------- // -------------------------------
// Android - not throws Helper::Error // Android - not throws Helper::Error
// ------------------------------- // -------------------------------

View File

@@ -241,5 +241,12 @@ uint64_t getRandomOffset(const uint64_t size, const uint64_t bufferSize) {
return rand() % maxOffset; return rand() % maxOffset;
} }
std::string convertTo(const uint64_t size, const std::string &multiple) {
if (multiple == "KB") return std::to_string(TO_KB(size));
if (multiple == "MB") return std::to_string(TO_MB(size));
if (multiple == "GB") return std::to_string(TO_GB(size));
return std::to_string(size);
}
std::string getLibVersion() { MKVERSION("libhelper"); } std::string getLibVersion() { MKVERSION("libhelper"); }
} // namespace Helper } // namespace Helper

View File

@@ -83,6 +83,8 @@ public:
bool operator==(const basic_partition_map &other) const; bool operator==(const basic_partition_map &other) const;
bool operator!=(const basic_partition_map &other) const; bool operator!=(const basic_partition_map &other) const;
bool operator!() const;
explicit operator bool() const;
Info operator[](int index) const; Info operator[](int index) const;
BasicInf operator[](const std::string_view& name) const; BasicInf operator[](const std::string_view& name) const;

View File

@@ -370,7 +370,7 @@ bool basic_partition_map_builder::doForPartitionList(
for (const auto &partition : partitions) { for (const auto &partition : partitions) {
if (!hasPartition(partition)) if (!hasPartition(partition))
throw Error("Couldn't find partition: %s", partition.data()); throw Error("Couldn't find partition: %s", partition.data());
if (!func(partition, {sizeOf(partition), isLogical(partition)})) { if (!func(partition, _current_map[partition])) {
err = true; err = true;
LOGN(MAP, ERROR) << "Failed progress for " << partition << " partition." LOGN(MAP, ERROR) << "Failed progress for " << partition << " partition."
<< std::endl; << std::endl;

View File

@@ -185,8 +185,7 @@ std::string basic_partition_map::find_(const std::string &name) const {
size_t basic_partition_map::size() const { return _count; } size_t basic_partition_map::size() const { return _count; }
bool basic_partition_map::empty() const { bool basic_partition_map::empty() const {
if (_count > 0) return false; return _count > 0;
return true;
} }
void basic_partition_map::clear() { void basic_partition_map::clear() {
@@ -229,6 +228,14 @@ bool basic_partition_map::operator!=(const basic_partition_map &other) const {
return !(*this == other); return !(*this == other);
} }
basic_partition_map::operator bool() const{
return _count > 0;
}
bool basic_partition_map::operator!() const{
return _count == 0;
}
Info basic_partition_map::operator[](const int index) const { Info basic_partition_map::operator[](const int index) const {
if (_count == 0 || index >= _count) return {}; if (_count == 0 || index >= _count) return {};
return _data[index]; return _data[index];