Skip to content

Commit d7fe820

Browse files
committed
transform_reduce
This is a parallelizable version of accumulate. These look like they can go out of order. Signed-off-by: Rosen Penev <[email protected]>
1 parent 83dbb4f commit d7fe820

File tree

1 file changed

+11
-23
lines changed

1 file changed

+11
-23
lines changed

src/tiffcomposite_int.cpp

Lines changed: 11 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,10 @@
1515
#include "value.hpp"
1616

1717
#include <algorithm>
18+
#include <functional>
1819
#include <iostream>
1920
#include <memory>
21+
#include <numeric>
2022

2123
// *****************************************************************************
2224
namespace {
@@ -1363,11 +1365,7 @@ size_t TiffDataEntry::doSizeData() const {
13631365
}
13641366

13651367
size_t TiffSubIfd::doSizeData() const {
1366-
size_t len = 0;
1367-
for (auto&& ifd : ifds_) {
1368-
len += ifd->size();
1369-
}
1370-
return len;
1368+
return std::transform_reduce(ifds_.begin(), ifds_.end(), size_t{0}, std::plus<>(), std::mem_fn(&TiffSubIfd::size));
13711369
}
13721370

13731371
size_t TiffIfdMakernote::doSizeData() const {
@@ -1379,22 +1377,14 @@ size_t TiffComponent::sizeImage() const {
13791377
}
13801378

13811379
size_t TiffDirectory::doSizeImage() const {
1382-
size_t len = 0;
1383-
for (auto&& component : components_) {
1384-
len += component->sizeImage();
1385-
}
1386-
if (pNext_) {
1387-
len += pNext_->sizeImage();
1388-
}
1389-
return len;
1380+
size_t len = pNext_ ? pNext_->sizeImage() : 0;
1381+
return std::transform_reduce(components_.begin(), components_.end(), len, std::plus<>(),
1382+
std::mem_fn(&TiffDirectory::sizeImage));
13901383
}
13911384

13921385
size_t TiffSubIfd::doSizeImage() const {
1393-
size_t len = 0;
1394-
for (auto&& ifd : ifds_) {
1395-
len += ifd->sizeImage();
1396-
}
1397-
return len;
1386+
return std::transform_reduce(ifds_.begin(), ifds_.end(), size_t{0}, std::plus<>(),
1387+
std::mem_fn(&TiffSubIfd::sizeImage));
13981388
} // TiffSubIfd::doSizeImage
13991389

14001390
size_t TiffIfdMakernote::doSizeImage() const {
@@ -1409,11 +1399,9 @@ size_t TiffImageEntry::doSizeImage() const {
14091399
if (!pValue())
14101400
return 0;
14111401
auto len = pValue()->sizeDataArea();
1412-
if (len == 0) {
1413-
for (const auto& [_, off] : strips_) {
1414-
len += off;
1415-
}
1416-
}
1402+
if (len == 0)
1403+
return std::transform_reduce(strips_.begin(), strips_.end(), len, std::plus<>(),
1404+
[](const auto& s) { return s.second; });
14171405
return len;
14181406
} // TiffImageEntry::doSizeImage
14191407

0 commit comments

Comments
 (0)