|
Katana Plug-in APIs 0.1
|
00001 // Copyright (c) 2012 The Foundry Visionmongers Ltd. All Rights Reserved. 00002 #pragma once 00003 00004 #include <cstdint> 00005 #include <limits> 00006 #include <sstream> 00007 #include <string> 00008 #include <boost/format.hpp> 00009 #include "SequenceMatching.h" 00010 00011 inline std::string generateFileNameString(const std::string& prefix, 00012 const uint32_t padding, 00013 const std::string& suffix, 00014 const uint32_t frame) 00015 { 00016 std::string noRangeSequenceRep = 00017 boost::str(boost::format("%s%%0%di%s") % prefix % padding % suffix); 00018 return boost::str(boost::format(noRangeSequenceRep) % frame); 00019 } 00020 00021 inline std::string generateFilesequenceString(const std::string& prefix, 00022 const int32_t padding, 00023 const std::string& suffix, 00024 const int32_t first, 00025 const int32_t last) 00026 { 00027 std::string sequenceRep = 00028 boost::str(boost::format("%s(%%0%di-%%0%di)%%%%0%dd%s") % prefix % 00029 padding % padding % padding % suffix); 00030 return boost::str(boost::format(sequenceRep) % first % last); 00031 } 00032 00033 struct FileNameParts 00034 { 00035 explicit FileNameParts(bool isValid) : isValid(isValid) {} 00036 FileNameParts(bool isValid, 00037 std::string prefix, 00038 std::string suffix, 00039 size_t padding, 00040 int32_t number, 00041 std::string filename) 00042 : isValid(isValid), 00043 prefix(std::move(prefix)), 00044 suffix(std::move(suffix)), 00045 padding(padding), 00046 number(number), 00047 filename(std::move(filename)) 00048 { 00049 } 00050 00051 explicit operator bool() const { return isValid; } 00052 friend std::ostream& operator<<(std::ostream& os, 00053 const FileNameParts& fileNameParts); 00054 00055 bool isValid; 00056 std::string prefix; 00057 std::string suffix; 00058 size_t padding; 00059 int32_t number; 00060 std::string filename; 00061 }; 00062 00063 inline std::ostream& operator<<(std::ostream& os, 00064 const FileNameParts& fileNameParts) 00065 { 00066 os << "prefix: " << fileNameParts.prefix 00067 << " suffix: " << fileNameParts.suffix 00068 << " padding: " << fileNameParts.padding 00069 << " number: " << fileNameParts.number 00070 << " filename: " << fileNameParts.filename << '\n'; 00071 return os; 00072 } 00073 00074 inline bool FileNamePartsComparator(const FileNameParts& a, 00075 const FileNameParts& b) 00076 { 00077 return std::tie(a.prefix, a.suffix, a.padding, a.number) < 00078 std::tie(b.prefix, b.suffix, b.padding, b.number); 00079 }; 00080 00081 inline bool isValidNumber(const std::string& s) 00082 { 00083 if (s.size() < 1 && 10 < s.size()) 00084 return false; 00085 if (s.find_first_not_of("0123456789") == std::string::npos) 00086 return true; 00087 return false; 00088 } 00089 00090 inline FileNameParts getFilePartsWithRegex(const std::string& fileName) 00091 { 00092 FilenameMatch match = makeFilenameMatch(fileName); 00093 if (!match.isValid) 00094 { 00095 return FileNameParts(false); 00096 } 00097 int32_t number; 00098 size_t padding; 00099 const std::string& numString(match.number); 00100 if (!isValidNumber(numString)) 00101 { 00102 return FileNameParts(false); 00103 } 00104 number = std::stoi(numString); 00105 padding = numString.length(); 00106 return FileNameParts{true, match.prefix, match.suffix, 00107 padding, number, fileName}; 00108 } 00109 00110 struct Sequence 00111 { 00112 Sequence(std::string prefix, 00113 int32_t firstFrame, 00114 int32_t lastFrame, 00115 size_t padding, 00116 std::string suffix) 00117 : prefix(prefix), 00118 firstFrame(firstFrame), 00119 lastFrame(lastFrame), 00120 padding(padding), 00121 suffix(suffix) 00122 { 00123 } 00124 std::string prefix; 00125 int32_t firstFrame; 00126 int32_t lastFrame; 00127 size_t padding; 00128 std::string suffix; 00129 };
1.7.3