11 #ifndef UT_PackageUtils_H
12 #define UT_PackageUtils_H
28 #include <hboost/any.hpp>
29 #include <patchlevel.h>
49 static const char *path_sep()
54 static char path_sep_char()
59 static const char *vardef_sep()
64 static UT_StringHolder makeVarRef(
const char * var_name,
bool use_symbol=
true,
65 const char * prefix=
nullptr,
const char * suffix=
nullptr)
70 wb.
format(
"{}{}{}{}", use_symbol ?
"$" :
"", prefix ? prefix :
"", var_name, suffix ? suffix :
"");
78 out_major = (_MSC_FULL_VER / 10000000) % 10000;
79 out_minor = (_MSC_FULL_VER / 100000) % 100;
81 #elif defined(__clang__)
83 out_major = __clang_major__;
84 out_minor = __clang_minor__;
86 #elif defined(__GNUC__)
89 out_minor = __GNUC_MINOR__;
106 sval.strip(kStripables.asHolder());
119 const char * var_value,
153 template <
typename T,
typename... Args>
156 return UTmakeShared<T>(std::forward<Args>(
args)...);
198 return SYSversionCompare(
247 return compare(other,
false ) == 0;
257 if (tokens.
size() > 4)
262 else if (tokens.
size()==1)
264 hver.
myMajor = SYSatoi(tokens[0].c_str());
266 else if (tokens.
size()==2)
268 hver.
myMajor = SYSatoi(tokens[0].c_str());
269 hver.
myMinor = SYSatoi(tokens[1].c_str());
271 else if (tokens.
size()==3)
273 hver.
myMajor = SYSatoi(tokens[0].c_str());
274 hver.
myMinor = SYSatoi(tokens[1].c_str());
275 hver.
myBuild = SYSatoi(tokens[2].c_str());
279 hver.
myMajor = SYSatoi(tokens[0].c_str());
280 hver.
myMinor = SYSatoi(tokens[1].c_str());
281 hver.
myBuild = SYSatoi(tokens[2].c_str());
282 hver.
myPatch = SYSatoi(tokens[3].c_str());
303 major.
itoa(PY_MAJOR_VERSION);
306 minor.
itoa(PY_MINOR_VERSION);
314 return thePYVersion.
buffer();
395 if (tokens.
size() > 3)
400 else if (tokens.
size()==1)
402 pyver.
myMajor = SYSatoi(tokens[0].c_str());
404 else if (tokens.
size()==2)
406 pyver.
myMajor = SYSatoi(tokens[0].c_str());
407 pyver.
myMinor = SYSatoi(tokens[1].c_str());
409 else if (tokens.
size()==3)
411 pyver.
myMajor = SYSatoi(tokens[0].c_str());
412 pyver.
myMinor = SYSatoi(tokens[1].c_str());
413 pyver.
myMicro = SYSatoi(tokens[2].c_str());
420 pyver.
myMajor = PY_MAJOR_VERSION;
421 pyver.
myMinor = PY_MINOR_VERSION;
422 pyver.
myMicro = PY_MICRO_VERSION;
491 if (!ver_str || !strlen(ver_str))
500 if (tokens.
size() < 1 || tokens.
size() > 3)
506 if (tokens.
size()==1)
508 pbver.
myName = tokens[0].c_str();
510 else if (tokens.
size()==2)
512 pbver.
myName = tokens[0].c_str();
513 pbver.
myMajor = SYSatoi(tokens[1].c_str());
517 pbver.
myName = tokens[0].c_str();
518 pbver.
myMajor = SYSatoi(tokens[1].c_str());
519 pbver.
myMinor = SYSatoi(tokens[2].c_str());
547 return unknown.
c_str();
632 void set(
const char *value)
684 wb.
format(
"{}", hboost::any_cast<fpreal64>(myValue));
686 else if (isA<int64>())
688 wb.
format(
"{}", hboost::any_cast<int64>(myValue));
690 else if (isA<bool>())
692 wb.
format(
"{}", hboost::any_cast<bool>(myValue) ?
"1" :
"0");
694 else if (isA<std::string>())
696 wb.
format(
"{}",hboost::any_cast<std::string>(myValue));
698 else if (isA<HVersion>())
700 auto && hver = hboost::any_cast<
HVersion>(myValue);
701 wb.
format(
"{}.{}.{}.{}",hver.myMajor,hver.myMinor,hver.myBuild,hver.myPatch);
703 else if (isA<PYVersion>())
705 auto && pyver = hboost::any_cast<
PYVersion>(myValue);
706 wb.
format(
"python{}.{}", pyver.myMajor,pyver.myMinor);
708 else if (isA<HPlatformBuildVersion>())
711 wb = hbc_ver.toString();
715 UT_ASSERT(!
"Unknown type in UT_Package::utils::Value");
721 template <
typename T>
722 T const &
get()
const
724 return hboost::any_cast<
T const &>(myValue);
727 template <
typename T>
730 return hboost::typeindex::type_id<T>() == myValue.type();
735 return !myValue.empty();
744 auto && lhs = hboost::any_cast<
std::string>(myValue);
746 return compareIgnoreCase(lhs, rhs);
754 if (isA<int64>() && other.
isA<
int64>())
756 return get<int64>() == other.
get<
int64>();
764 if (isA<bool>() && other.
isA<
bool>())
766 return get<bool>() == other.
get<
bool>();
777 return get<HVersion>() == hver;
794 return get<PYVersion>() == pyver;
811 return get<HPlatformBuildVersion>() == pbver;
820 throw std::runtime_error(
"utils::Value::isEqual: unsupported type");
838 return get<HVersion>() > hver;
855 return get<PYVersion>() > pyver;
872 return get<HPlatformBuildVersion>() > pbver;
883 throw std::runtime_error(
"utils::Value::isGreater: unsupported types");
909 return get<HVersion>() < hver;
926 return get<PYVersion>() < pyver;
943 return get<HPlatformBuildVersion>() < pbver;
954 throw std::runtime_error(
"utils::Value::isLess: unsupported types");
968 if (
valid() && isA<std::string>())
970 auto && to_replace = get<std::string>();
984 return ((s1.size() == s2.size()) &&
986 [](
char & c1,
char & c2)
988 return (c1 == c2 || std::toupper(c1) == std::toupper(c2));
1011 : myHasErrorFlag(false)
1012 , myLog(&myDefaultLog)
1013 , myVerboseFlag(false)
1019 myVerboseFlag = flag;
1024 return myVerboseFlag;
1032 myHasErrorFlag =
true;
1036 template<
typename ...Args >
1042 myHasErrorFlag =
true;
1055 template<
typename ...Args >
1071 addToBuffer(
nullptr, msg);
1074 template<
typename ...Args >
1081 addToBuffer(
nullptr, formatMsg(msg, std::forward<Args>(
args)...));
1089 template<
typename ...Args >
1097 myDefaultLog.
clear();
1099 myEntryArray.
clear();
1100 myErrorArray.
clear();
1101 myWarningArray.
clear();
1102 myHasErrorFlag =
false;
1107 myErrorArray.
clear();
1108 myHasErrorFlag =
false;
1113 for (
auto && entry : myEntryArray)
1115 os << entry.c_str() << std::endl;
1116 auto && it = myEntryMap.find(entry);
1117 os << it->second.c_str() << std::endl;
1122 os << myDefaultLog.
c_str() << std::endl;
1131 if (header && myVerboseFlag)
1133 log +=
"= = = Houdini Package log = = =\n";
1138 if (header && myVerboseFlag)
1140 log +=
"= = = = = = = = = = = = = = = =\n";
1147 return myErrorArray;
1152 return myWarningArray;
1159 std::cout << title << std::endl;
1164 std::cerr << title << std::endl;
1174 myLog = &myDefaultLog;
1179 if (!myEntryMap.count(entry))
1182 myEntryArray.
append(entry);
1184 myLog = &myEntryMap[entry];
1189 return myHasErrorFlag;
1207 template<
typename ...Args >
1215 void addToBuffer(
const char* prefix,
const char* msg)
1217 if (!msg || !strlen(msg))
1232 myErrorArray.
append(msg);
1236 myWarningArray.
append(msg);
1256 bool myHasErrorFlag;
1263 #endif // UT_PackageUtils_H
bool isGreaterEqual(utils::Value const &other) const
bool operator>=(PYVersion const &other) const
std::string ignore_case(std::string item)
Helper function to allow ignore_case to be passed to IsMember or Transform.
UT_API void normalizePath(UT_String &file_path, bool want_marker=false, bool always_want_expanded_path=false)
bool isGreater(utils::Value const &other) const
bool operator>(HVersion const &other) const
UT_API bool buildVarDependency(UT_StringHolder const &var_name, const char *var_value, UT_StringArray &unset_vars, UT_StringMap< UT_StringSet > &vars_dep_map, UT_StringMap< UT_StringSet > &vars_circ_dep)
UT_StringHolder toString(bool header=true) const
void start(char const *entry)
bool operator>=(HVersion const &other) const
SYS_FORCE_INLINE void clear()
bool operator<=(PYVersion const &other) const
int compare(HVersion const &other, bool full=true) const
GLsizei const GLchar *const * string
bool operator<(HVersion const &other) const
bool isEmpty() const
Same as !isstring()
UT_API UT_StringHolder makeVarRefPlatform(const char *var)
bool operator==(PYVersion const &other) const
static char const * toString()
SYS_FORCE_INLINE const char * buffer() const
void info(char const *msg, Args &&...args)
int compare(PYVersion const &other) const
int substitute(const char *find, const char *replacement, int count=-1)
An output stream object that owns its own string buffer storage.
void message(char const *msg)
IMATH_HOSTDEVICE constexpr bool equal(T1 a, T2 b, T3 t) IMATH_NOEXCEPT
bool equal(const UT_StringRef &str, bool ignore_case=false) const
void message(char const *msg, Args &&...args)
bool substitute(char const *find, char const *replace_with)
bool operator<=(HVersion const &other) const
UT_StringArray const & errors() const
auto arg(const Char *name, const T &arg) -> detail::named_arg< Char, T >
static void getVersion(PYVersion &pyver)
const UT_WorkBuffer & str()
Returns a read-only reference to the underlying UT_WorkBuffer.
void toStream(std::ostream &os) const
void error(char const *msg, Args &&...args)
UT_StringHolder toString() const
void set(PYVersion value)
void set(HPlatformBuildVersion value)
int tokenize(char *argv[], int max_args, char separator)
bool any(const vbool4 &v)
std::shared_ptr< T > UT_SharedPtr
Wrapper around std::shared_ptr.
UT_API const char * pathSepShell()
UT_WorkBuffer toWorkBuffer() const
UT_StringArray const & warnings() const
bool isLess(utils::Value const &other) const
hboost::any const & value() const
GLint GLint GLsizei GLint GLenum format
Value(UT_StringRef const &value)
static UT_SharedPtr< T > make(Args &&...args)
UT_API UT_StringHolder expandVar(const char *arg, bool want_marker)
static PYVersion convert(char const *pyver_str)
void set(const char *value)
bool isEqual(utils::Value const &other, bool ignore_case=false) const
SYS_FORCE_INLINE const char * c_str() const
void error(char const *msg)
void warning(char const *msg, Args &&...args)
UT_API UT_StringHolder cnormalizePath(UT_StringHolder const &file_path, bool want_marker=false, bool always_want_expanded_path=false)
constexpr UT_StringLit klog_error
bool operator==(HVersion const &other) const
void append(Logger const &logger)
UT_StringMap< UT_StringHolder > EntryMap
UT_StringArray EntryArray
UT_API void normalizeEnvVarPath(UT_String &file_path, bool want_marker=false, bool always_want_expanded_path=false)
size_t format(const char *fmt, const Args &...args)
constexpr UT_StringLit klog_info
void log(char const *title, Flags flags=Flags::all) const
bool operator<(PYVersion const &other) const
constexpr UT_StringLit klog_warning
SYS_FORCE_INLINE const UT_StringHolder & asHolder() const
bool operator>(PYVersion const &other) const
**If you just want to fire and args
void info(char const *msg)
void clear()
Resets list to an empty list.
static HVersion convert(UT_StringRef const &str)
void setAsVerbose(bool flag)
bool startsWith(const UT_StringView &prefix, bool case_sensitive=true) const
void warning(char const *msg)
bool isLessEqual(utils::Value const &other) const
Value(HPlatformBuildVersion value)
SYS_FORCE_INLINE bool isstring() const
FMT_CONSTEXPR auto find(Ptr first, Ptr last, T value, Ptr &out) -> bool