summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2018-07-24 10:18:44 +0100
committerCarl Hetherington <cth@carlh.net>2018-07-24 10:18:44 +0100
commitb3de36fc3d7c031e40be73b937fc183f82bb0a8c (patch)
treedcb178a077a4de17eb47406b0e0db8a75a43dbc1
parent24dcab1d4d8d7a28a939c7c4d786197684f155f6 (diff)
Fix image filename sorter with filenames that have lots of numbers.
-rw-r--r--src/lib/image_filename_sorter.cc28
-rw-r--r--src/lib/image_filename_sorter.h2
-rw-r--r--test/image_filename_sorter_test.cc2
3 files changed, 16 insertions, 16 deletions
diff --git a/src/lib/image_filename_sorter.cc b/src/lib/image_filename_sorter.cc
index c32b07115..47f46e81d 100644
--- a/src/lib/image_filename_sorter.cc
+++ b/src/lib/image_filename_sorter.cc
@@ -33,16 +33,22 @@ using boost::optional;
bool
ImageFilenameSorter::operator() (boost::filesystem::path a, boost::filesystem::path b)
{
- optional<int> na = extract_numbers (a);
- optional<int> nb = extract_numbers (b);
- if (!na || !nb) {
- return a.string() < b.string();
+ string an = extract_numbers (a);
+ string bn = extract_numbers (b);
+
+ int const anl = an.length ();
+ int const bnl = bn.length ();
+
+ if (anl > bnl) {
+ bn = string(anl - bnl, '0') + bn;
+ } else if (bnl > anl) {
+ an = string(bnl - anl, '0') + an;
}
- return *na < *nb;
+ return an < bn;
}
-optional<int>
+string
ImageFilenameSorter::extract_numbers (boost::filesystem::path p)
{
string numbers;
@@ -52,13 +58,5 @@ ImageFilenameSorter::extract_numbers (boost::filesystem::path p)
numbers += ps[i];
}
}
-
- if (numbers.empty ()) {
- return optional<int> ();
- }
-
- /* locale_convert is quicker than raw_convert and numbers can only contain
- things which are isdigit() so locale_convert is fine to use.
- */
- return locale_convert<int> (numbers);
+ return numbers;
}
diff --git a/src/lib/image_filename_sorter.h b/src/lib/image_filename_sorter.h
index 2a15639ce..960b1d8a7 100644
--- a/src/lib/image_filename_sorter.h
+++ b/src/lib/image_filename_sorter.h
@@ -27,5 +27,5 @@ public:
bool operator() (boost::filesystem::path a, boost::filesystem::path b);
private:
- boost::optional<int> extract_numbers (boost::filesystem::path p);
+ std::string extract_numbers (boost::filesystem::path p);
};
diff --git a/test/image_filename_sorter_test.cc b/test/image_filename_sorter_test.cc
index f2af9000c..7512fdffb 100644
--- a/test/image_filename_sorter_test.cc
+++ b/test/image_filename_sorter_test.cc
@@ -43,6 +43,7 @@ BOOST_AUTO_TEST_CASE (image_filename_sorter_test1)
BOOST_CHECK (x ("/my/numeric999/path/00057.tif", "/my/numeric999/path/00166.tif"));
BOOST_CHECK (x ("1_01.tif", "1_02.tif"));
BOOST_CHECK (x ("EWS_DCP_092815_000000.j2c", "EWS_DCP_092815_000001.j2c"));
+ BOOST_CHECK (x ("ap_trlr_178_uhd_bt1886_txt_e5c1_033115.86352.dpx", "ap_trlr_178_uhd_bt1886_txt_e5c1_033115.86353.dpx"));
BOOST_CHECK (!x ("abc0000000002", "abc0000000001"));
BOOST_CHECK (!x ("2", "1"));
@@ -53,6 +54,7 @@ BOOST_AUTO_TEST_CASE (image_filename_sorter_test1)
BOOST_CHECK (!x ("1_02.tif", "1_01.tif"));
BOOST_CHECK (!x ("EWS_DCP_092815_000000.j2c", "EWS_DCP_092815_000000.j2c"));
BOOST_CHECK (!x ("EWS_DCP_092815_000100.j2c", "EWS_DCP_092815_000000.j2c"));
+ BOOST_CHECK (!x ("ap_trlr_178_uhd_bt1886_txt_e5c1_033115.86353.dpx", "ap_trlr_178_uhd_bt1886_txt_e5c1_033115.86352.dpx"));
}
/** Test a sort of a lot of paths. Mostly useful for profiling. */