Katana Plug-in APIs 0.1

FileSequenceInternal.h

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 };
 All Classes Functions Variables Typedefs Enumerations Enumerator