Missing finalize() in dcpdecryptmxf.
[libdcp.git] / src / raw_convert.cc
index cb7807a3c1712f1218c258fc198b2647d110f744..7d3d1a72002b49511ca439eef728674b213fa063 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2014 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2014-2021 Carl Hetherington <cth@carlh.net>
 
     This file is part of libdcp.
 
     files in the program, then also delete it here.
 */
 
+
 #include "raw_convert.h"
 #include "locale_convert.h"
 #include <boost/algorithm/string.hpp>
 
+
 using std::string;
+using std::wstring;
 
+
+/** @param v Numeric value as an ASCII string */
 static
 string
 make_raw (string v)
 {
        struct lconv* lc = localeconv ();
-       boost::algorithm::replace_all (v, lc->decimal_point, ".");
+       /* thousands_sep may be . so remove them before changing decimal points */
        boost::algorithm::replace_all (v, lc->thousands_sep, "");
+       boost::algorithm::replace_all (v, lc->decimal_point, ".");
        return v;
 }
 
+
 static
 string
 make_local (string v)
@@ -57,6 +64,23 @@ make_local (string v)
        return v;
 }
 
+
+template <>
+string
+dcp::raw_convert (unsigned char v, int precision, bool fixed)
+{
+       return make_raw (locale_convert<string> (v, precision, fixed));
+}
+
+
+template <>
+string
+dcp::raw_convert (unsigned short int v, int precision, bool fixed)
+{
+       return make_raw (locale_convert<string> (v, precision, fixed));
+}
+
+
 template <>
 string
 dcp::raw_convert (int v, int precision, bool fixed)
@@ -64,20 +88,47 @@ dcp::raw_convert (int v, int precision, bool fixed)
        return make_raw (locale_convert<string> (v, precision, fixed));
 }
 
+
 template <>
 string
-dcp::raw_convert (int64_t v, int precision, bool fixed)
+dcp::raw_convert (unsigned int v, int precision, bool fixed)
 {
        return make_raw (locale_convert<string> (v, precision, fixed));
 }
 
+
 template <>
 string
-dcp::raw_convert (uint64_t v, int precision, bool fixed)
+dcp::raw_convert (long v, int precision, bool fixed)
 {
        return make_raw (locale_convert<string> (v, precision, fixed));
 }
 
+
+template <>
+string
+dcp::raw_convert (unsigned long v, int precision, bool fixed)
+{
+       return make_raw (locale_convert<string> (v, precision, fixed));
+}
+
+
+template <>
+string
+dcp::raw_convert (long long v, int precision, bool fixed)
+{
+       return make_raw (locale_convert<string> (v, precision, fixed));
+}
+
+
+template <>
+string
+dcp::raw_convert (unsigned long long v, int precision, bool fixed)
+{
+       return make_raw (locale_convert<string> (v, precision, fixed));
+}
+
+
 template <>
 string
 dcp::raw_convert (float v, int precision, bool fixed)
@@ -85,6 +136,7 @@ dcp::raw_convert (float v, int precision, bool fixed)
        return make_raw (locale_convert<string> (v, precision, fixed));
 }
 
+
 template <>
 string
 dcp::raw_convert (double v, int precision, bool fixed)
@@ -92,6 +144,7 @@ dcp::raw_convert (double v, int precision, bool fixed)
        return make_raw (locale_convert<string> (v, precision, fixed));
 }
 
+
 template <>
 string
 dcp::raw_convert (char const * v, int, bool)
@@ -99,6 +152,7 @@ dcp::raw_convert (char const * v, int, bool)
        return v;
 }
 
+
 template <>
 string
 dcp::raw_convert (char* v, int, bool)
@@ -106,6 +160,7 @@ dcp::raw_convert (char* v, int, bool)
        return v;
 }
 
+
 template <>
 string
 dcp::raw_convert (string v, int, bool)
@@ -113,6 +168,42 @@ dcp::raw_convert (string v, int, bool)
        return v;
 }
 
+
+template <>
+string
+dcp::raw_convert (char v, int, bool)
+{
+       string s;
+       s += v;
+       return s;
+}
+
+
+template <>
+string
+dcp::raw_convert (wchar_t const * v, int, bool)
+{
+       wstring w (v);
+       return string (w.begin(), w.end());
+}
+
+
+template <>
+unsigned char
+dcp::raw_convert (std::string v, int precision, bool fixed)
+{
+       return locale_convert<unsigned char> (make_local (v), precision, fixed);
+}
+
+
+template <>
+unsigned short int
+dcp::raw_convert (std::string v, int precision, bool fixed)
+{
+       return locale_convert<unsigned short int> (make_local (v), precision, fixed);
+}
+
+
 template <>
 int
 dcp::raw_convert (string v, int precision, bool fixed)
@@ -120,6 +211,39 @@ dcp::raw_convert (string v, int precision, bool fixed)
        return locale_convert<int> (make_local (v), precision, fixed);
 }
 
+
+template <>
+long
+dcp::raw_convert (string v, int precision, bool fixed)
+{
+       return locale_convert<long> (make_local (v), precision, fixed);
+}
+
+
+template <>
+unsigned long
+dcp::raw_convert (string v, int precision, bool fixed)
+{
+       return locale_convert<unsigned long> (make_local (v), precision, fixed);
+}
+
+
+template <>
+long long
+dcp::raw_convert (string v, int precision, bool fixed)
+{
+       return locale_convert<long long> (make_local (v), precision, fixed);
+}
+
+
+template <>
+unsigned long long
+dcp::raw_convert (string v, int precision, bool fixed)
+{
+       return locale_convert<unsigned long long> (make_local (v), precision, fixed);
+}
+
+
 template <>
 int
 dcp::raw_convert (char const * v, int precision, bool fixed)
@@ -127,6 +251,7 @@ dcp::raw_convert (char const * v, int precision, bool fixed)
        return locale_convert<int> (make_local (v), precision, fixed);
 }
 
+
 template <>
 float
 dcp::raw_convert (string v, int precision, bool fixed)
@@ -134,6 +259,7 @@ dcp::raw_convert (string v, int precision, bool fixed)
        return locale_convert<float> (make_local (v), precision, fixed);
 }
 
+
 template <>
 float
 dcp::raw_convert (char const * v, int precision, bool fixed)
@@ -141,6 +267,7 @@ dcp::raw_convert (char const * v, int precision, bool fixed)
        return locale_convert<float> (make_local (v), precision, fixed);
 }
 
+
 template <>
 double
 dcp::raw_convert (string v, int precision, bool fixed)
@@ -148,6 +275,7 @@ dcp::raw_convert (string v, int precision, bool fixed)
        return locale_convert<double> (make_local (v), precision, fixed);
 }
 
+
 template <>
 double
 dcp::raw_convert (char const * v, int precision, bool fixed)