@@ -742,11 +742,13 @@ void Converter::cnvExifVersion(const char* from, const char* to) {
742742 return ;
743743 if (!prepareXmpTarget (to))
744744 return ;
745- std::ostringstream value;
746- for (size_t i = 0 ; i < pos->count (); ++i) {
747- value << static_cast <char >(pos->toInt64 (i));
745+ auto count = pos->count ();
746+ std::string value;
747+ value.reserve (count);
748+ for (size_t i = 0 ; i < count; ++i) {
749+ value += static_cast <char >(pos->toInt64 (i));
748750 }
749- (*xmpData_)[to] = value. str () ;
751+ (*xmpData_)[to] = value;
750752 if (erase_)
751753 exifData_->erase (pos);
752754}
@@ -757,13 +759,13 @@ void Converter::cnvExifGPSVersion(const char* from, const char* to) {
757759 return ;
758760 if (!prepareXmpTarget (to))
759761 return ;
760- std::ostringstream value;
762+ std::string value;
761763 for (size_t i = 0 ; i < pos->count (); ++i) {
762764 if (i > 0 )
763- value << ' .' ;
764- value << pos->toInt64 (i);
765+ value += ' .' ;
766+ value += std::to_string ( pos->toInt64 (i) );
765767 }
766- (*xmpData_)[to] = value. str () ;
768+ (*xmpData_)[to] = value;
767769 if (erase_)
768770 exifData_->erase (pos);
769771}
@@ -826,9 +828,7 @@ void Converter::cnvExifGPSCoord(const char* from, const char* to) {
826828 double min = (deg[0 ] * 60.0 ) + deg[1 ] + (deg[2 ] / 60.0 );
827829 auto ideg = static_cast <int >(min / 60.0 );
828830 min -= ideg * 60 ;
829- std::ostringstream oss;
830- oss << ideg << " ," << std::fixed << std::setprecision (7 ) << min << refPos->toString ().c_str ()[0 ];
831- (*xmpData_)[to] = oss.str ();
831+ (*xmpData_)[to] = stringFormat (" {},{:.7f}{}" , ideg, min, refPos->toString ().front ());
832832
833833 if (erase_)
834834 exifData_->erase (pos);
@@ -883,7 +883,7 @@ void Converter::cnvXmpArray(const char* from, const char* to) {
883883 auto pos = xmpData_->findKey (XmpKey (from));
884884 if (pos == xmpData_->end ())
885885 return ;
886- std::ostringstream array;
886+ std::string array;
887887 for (size_t i = 0 ; i < pos->count (); ++i) {
888888 std::string value = pos->toString (i);
889889 if (!pos->value ().ok ()) {
@@ -892,11 +892,11 @@ void Converter::cnvXmpArray(const char* from, const char* to) {
892892#endif
893893 return ;
894894 }
895- array << value;
895+ array += value;
896896 if (i != pos->count () - 1 )
897- array << " " ;
897+ array += " " ;
898898 }
899- (*exifData_)[to] = array. str () ;
899+ (*exifData_)[to] = array;
900900 if (erase_)
901901 xmpData_->erase (pos);
902902}
@@ -997,12 +997,9 @@ void Converter::cnvXmpVersion(const char* from, const char* to) {
997997#endif
998998 return ;
999999 }
1000- std::ostringstream array;
10011000
1002- array << static_cast <int >(value[0 ]) << " " << static_cast <int >(value[1 ]) << " " << static_cast <int >(value[2 ]) << " "
1003- << static_cast <int >(value[3 ]);
1004-
1005- (*exifData_)[to] = array.str ();
1001+ (*exifData_)[to] = stringFormat (" {} {} {} {}" , static_cast <int >(value[0 ]), static_cast <int >(value[1 ]),
1002+ static_cast <int >(value[2 ]), static_cast <int >(value[3 ]));
10061003 if (erase_)
10071004 xmpData_->erase (pos);
10081005}
@@ -1234,7 +1231,7 @@ void Converter::cnvXmpValueToIptc(const char* from, const char* to) {
12341231
12351232#ifdef EXV_HAVE_XMP_TOOLKIT
12361233std::string Converter::computeExifDigest (bool tiff) {
1237- std::ostringstream res;
1234+ std::string res;
12381235 MD5_CTX context;
12391236 unsigned char digest[16 ];
12401237
@@ -1247,9 +1244,9 @@ std::string Converter::computeExifDigest(bool tiff) {
12471244 if (!tiff && key.groupName () == " Image" )
12481245 continue ;
12491246
1250- if (!res.str (). empty ())
1251- res << ' ,' ;
1252- res << key.tag ();
1247+ if (!res.empty ())
1248+ res += ' ,' ;
1249+ res += key.tag ();
12531250 auto pos = exifData_->findKey (key);
12541251 if (pos == exifData_->end ())
12551252 continue ;
@@ -1259,12 +1256,11 @@ std::string Converter::computeExifDigest(bool tiff) {
12591256 }
12601257 }
12611258 MD5Final (digest, &context);
1262- res << ' ;' ;
1263- res << std::setw (2 ) << std::setfill (' 0' ) << std::hex << std::uppercase;
1259+ res += ' ;' ;
12641260 for (const auto & i : digest) {
1265- res << static_cast < int >( i);
1261+ res += stringFormat ( " {:02X} " , i);
12661262 }
1267- return res. str () ;
1263+ return res;
12681264}
12691265#else
12701266std::string Converter::computeExifDigest (bool ) {
0 commit comments