summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2015-07-17 00:41:04 +0100
committerCarl Hetherington <cth@carlh.net>2015-07-17 00:41:04 +0100
commit12e20e180062dbc338e775bd1f5ec7a2af91df7f (patch)
tree7c6f3bd3b4af92967764c86b80c3a8b052db55bf
parentb0a4408ea45787a71592c63526ea5a8f2fe3f1fe (diff)
Improve image filename sorter.
-rw-r--r--ChangeLog4
-rw-r--r--src/lib/image_filename_sorter.cc40
-rw-r--r--test/image_filename_sorter_test.cc2
3 files changed, 33 insertions, 13 deletions
diff --git a/ChangeLog b/ChangeLog
index 3d149a824..d6ae72fb8 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2015-07-17 Carl Hetherington <cth@carlh.net>
+
+ * Improve still-image filename sorting.
+
2015-07-16 Carl Hetherington <cth@carlh.net>
* Updated ru_RU translation from Igor Voytovich.
diff --git a/src/lib/image_filename_sorter.cc b/src/lib/image_filename_sorter.cc
index 5a3e1dcec..037446398 100644
--- a/src/lib/image_filename_sorter.cc
+++ b/src/lib/image_filename_sorter.cc
@@ -27,35 +27,49 @@ class ImageFilenameSorter
public:
bool operator() (boost::filesystem::path a, boost::filesystem::path b)
{
- boost::optional<int> na = extract_number (a);
- boost::optional<int> nb = extract_number (b);
- if (!na || !nb) {
- return a.string() < b.string();
+ std::vector<int> na = extract_numbers (a);
+ std::vector<int> nb = extract_numbers (b);
+
+ std::vector<int>::const_iterator i = na.begin ();
+ std::vector<int>::const_iterator j = nb.begin ();
+
+ while (true) {
+ if (i == na.end () || j == nb.end ()) {
+ return false;
+ }
+
+ if (*i != *j) {
+ return *i < *j;
+ }
+
+ ++i;
+ ++j;
}
- return na.get() < nb.get();
+ /* NOT REACHED */
+ return false;
}
private:
- boost::optional<int> extract_number (boost::filesystem::path p)
+ std::vector<int> extract_numbers (boost::filesystem::path p)
{
p = p.leaf ();
+ std::vector<int> numbers;
std::string number;
for (size_t i = 0; i < p.string().size(); ++i) {
if (isdigit (p.string()[i])) {
number += p.string()[i];
- } else {
- if (!number.empty ()) {
- break;
- }
+ } else if (!number.empty ()) {
+ numbers.push_back (raw_convert<int> (number));
+ number.clear ();
}
}
- if (number.empty ()) {
- return boost::optional<int> ();
+ if (!number.empty ()) {
+ numbers.push_back (raw_convert<int> (number));
}
- return raw_convert<int> (number);
+ return numbers;
}
};
diff --git a/test/image_filename_sorter_test.cc b/test/image_filename_sorter_test.cc
index 830065f77..4bdd16f55 100644
--- a/test/image_filename_sorter_test.cc
+++ b/test/image_filename_sorter_test.cc
@@ -31,6 +31,7 @@ BOOST_AUTO_TEST_CASE (image_filename_sorter_test)
BOOST_CHECK (x ("1", "999"));
BOOST_CHECK (x ("00057.tif", "00166.tif"));
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 ("abc0000000002", "abc0000000001"));
BOOST_CHECK (!x ("2", "1"));
@@ -38,4 +39,5 @@ BOOST_AUTO_TEST_CASE (image_filename_sorter_test)
BOOST_CHECK (!x ("2", "0001"));
BOOST_CHECK (!x ("999", "1"));
BOOST_CHECK (!x ("/my/numeric999/path/00166.tif", "/my/numeric999/path/00057.tif"));
+ BOOST_CHECK (!x ("1_02.tif", "1_01.tif"));
}