emory/tools/analyse.cpp

87 lines
2.2 KiB
C++

/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* Copyright 2019 Danny Robson <danny@nerdcruft.net>
*/
#include "emory/chunk/map.hpp"
#include "emory/chunk/params.hpp"
#include <cruft/util/io.hpp>
#include <cruft/util/view.hpp>
#include <cruft/util/parse/value.hpp>
#include <algorithm>
#include <iostream>
#include <compare>
///////////////////////////////////////////////////////////////////////////////
enum {
ARG_SELF,
ARG_BITS,
ARG_WINDOW,
ARGS_MINIMUM,
ARGS_INPUT,
NUM_ARGS,
};
//-----------------------------------------------------------------------------
static
std::strong_ordering
region_ordering (
emory::chunk::region const &a,
emory::chunk::region const &b
) {
if (auto const cmp = a.size () <=> b.size (); cmp != 0)
return cmp;
for (int i = 0; i < std::ssize (a.digest); ++i)
if (auto const cmp = a.digest[i] <=> b.digest[i]; cmp != 0)
return cmp;
return std::strong_ordering::equal;
}
static bool region_less (emory::chunk::region const &a, emory::chunk::region const &b)
{
return region_ordering (a, b) < 0;
}
static bool region_equal (emory::chunk::region const &a, emory::chunk::region const &b)
{
return region_ordering (a, b) == 0;
}
//static bool overlap (emory::chunk::region const &a, emory::chunk::region const &b)
//{
// return a.offset.first < b.offset.second &&
// b.offset.first < a.offset.second;
//}
//-----------------------------------------------------------------------------
int main (int argc, char const **argv)
{
if (argc != NUM_ARGS) {
std::cerr << "usage: " << argv[ARG_SELF] << " <bits> <window> <minimum> <input>\n";
return EXIT_FAILURE;
}
emory::chunk::params const p {
.bits = cruft::parse::from_string<std::size_t> (argv[ARG_BITS ]),
.window = cruft::parse::from_string<std::size_t> (argv[ARG_WINDOW]),
.minimum = cruft::parse::from_string<std::ptrdiff_t> (argv[ARGS_MINIMUM]),
};
cruft::mapped_file data (argv[ARGS_INPUT]);
emory::chunk::map src (data, p);
std::cout << src.size () << " chunks\n";
}