From c638b9a3b048d3158c192b4191c2e10d49b4e10d Mon Sep 17 00:00:00 2001
From: namark <nshan.nnnn@gmail.com>
Date: Sat, 13 Jan 2018 04:24:59 +0400
Subject: [PATCH] Improvement is crop:

making use of range type and string to number/range parsers from
simple/support.
---
 crop.cpp | 46 ++++++++--------------------------------------
 1 file changed, 8 insertions(+), 38 deletions(-)

diff --git a/crop.cpp b/crop.cpp
index 7888e98..7f3fefb 100644
--- a/crop.cpp
+++ b/crop.cpp
@@ -4,6 +4,7 @@
 #include <string>
 #include "simple/file.hpp"
 #include "simple/support/enum.hpp"
+#include "simple/support/misc.hpp"
 
 using namespace simple;
 using namespace std::literals;
@@ -66,34 +67,7 @@ template <> Color::Guts::map_type Color::Guts::map
 	{ "white"s }
 }};
 
-std::pair<size_t,size_t> stoull_pair(const std::string& str)
-{
-	size_t separator;
-	auto first = std::stoull(str, &separator, 0);
-	auto second = std::stoull(str.substr(separator+1), nullptr, 0);
-	if(':' == str[separator])
-		second += first;
-	return {first, second};
-}
-
-template <typename Iterator>
-struct iterator_range
-{
-	using iterator_type = Iterator;
-	using array_type = std::array<iterator_type, 2>;
-	iterator_type& begin() { return raw[0]; }
-	iterator_type& end() { return raw[1]; }
-	const iterator_type& begin() const { return raw[0]; }
-	const iterator_type& end() const { return raw[1]; }
-
-	array_type raw;
-};
-template <typename Iterator>
-iterator_range<Iterator> make_iterator_range(Iterator begin, Iterator end)
-{
-	return {begin, end};
-}
-using const_range = iterator_range<file::buffer<>::const_iterator>;
+using const_range = support::range<file::buffer<>::const_iterator>;
 
 void print(const_range range, Format format, Color color = Colors::Invalid)
 {
@@ -132,15 +106,11 @@ void print(const_range range, Format format, Color color = Colors::Invalid)
 
 void crop(const string& filename, const string& range, Color color, size_t padding, Format format)
 {
-	auto p = stoull_pair(range);
-	auto source = file::dump(file::bropex(filename));
-	auto lower = std::min(source.begin() + p.first, source.end());
-	auto upper = std::min(source.begin() + p.second, source.end());
-	auto left = lower - std::min(p.first, padding);
-	auto right = upper + std::min<size_t>(source.end() - upper, padding);
-	print({left , lower}, format);
-	print({lower, upper}, format, color);
-	print({upper, right}, format);
+	auto r = support::storn<size_t>(range);
+	const auto source = file::dump(file::bropex(filename));
+	print(support::get_iterator_range(source, {r.lower()-padding , r.lower()}), format);
+	print(support::get_iterator_range(source, r), format, color);
+	print(support::get_iterator_range(source, {r.upper(), r.upper()+padding}), format);
 }
 
 void process_arguments(std::deque<string> args)
@@ -157,7 +127,7 @@ void process_arguments(std::deque<string> args)
 
 			case Options::Padding:
 				args.pop_front();
-				padding = stoull(args.at(0), nullptr, 0);
+				padding = support::ston<size_t>(args.at(0));
 			break;
 
 			case Options::Color:
-- 
GitLab