@@ -288,36 +288,42 @@ namespace FileCore {
288288 {
289289 template <typename TL, typename TR>
290290 bool operator ()(const TL& a, const TR& b) const { return StringInfo::Strcmp (StringInfo::CStr (a), StringInfo::CStr (b)) < 0 ; }
291+ using is_transparent = int ;
291292 };
292293
293294 struct LessInsensitive
294295 {
295296 template <typename TL, typename TR>
296297 bool operator ()(const TL& a, const TR& b) const { return StringInfo::Stricmp (StringInfo::CStr (a), StringInfo::CStr (b)) < 0 ; }
298+ using is_transparent = int ;
297299 };
298300
299301 struct Greater
300302 {
301303 template <typename TL, typename TR>
302304 bool operator ()(const TL& a, const TR& b) const { return StringInfo::Strcmp (StringInfo::CStr (a), StringInfo::CStr (b)) > 0 ; }
305+ using is_transparent = int ;
303306 };
304307
305308 struct GreaterInsensitive
306309 {
307310 template <typename TL, typename TR>
308311 bool operator ()(const TL& a, const TR& b) const { return StringInfo::Stricmp (StringInfo::CStr (a), StringInfo::CStr (b)) > 0 ; }
312+ using is_transparent = int ;
309313 };
310314
311315 struct Equal
312316 {
313317 template <typename TL, typename TR>
314318 bool operator ()(const TL& a, const TR& b) const { return StringInfo::Strcmp (StringInfo::CStr (a), StringInfo::CStr (b)) == 0 ; }
319+ using is_transparent = int ;
315320 };
316321
317322 struct EqualInsensitive
318323 {
319324 template <typename TL, typename TR>
320325 bool operator ()(const TL& a, const TR& b) const { return StringInfo::Stricmp (StringInfo::CStr (a), StringInfo::CStr (b)) == 0 ; }
326+ using is_transparent = int ;
321327 };
322328
323329 class WtoA
@@ -377,6 +383,7 @@ namespace FileCore {
377383 };
378384
379385 #define LITERAL (CharType, str ) ::Microsoft::P4VFS::FileCore::StringInfo::Traits::Type<CharType>::Literal(str, L##str)
386+ #define LITERAL_STRING (StringType, str ) LITERAL(typename std::decay<decltype (StringType)>::type::value_type, str)
380387 };
381388
382389 struct P4VFS_CORE_API FileInfo
@@ -603,6 +610,12 @@ namespace FileCore {
603610 return std::any_of (elements.begin (), elements.end (), predicate);
604611 }
605612
613+ template <typename ArrayType, typename Predicate>
614+ static bool All (const ArrayType& elements, Predicate predicate)
615+ {
616+ return std::all_of (elements.begin (), elements.end (), predicate);
617+ }
618+
606619 template <typename ArrayType, typename Predicate>
607620 static void RemoveIf (ArrayType& elements, Predicate predicate)
608621 {
@@ -739,18 +752,20 @@ namespace FileCore {
739752 do { if (((v) == (ns::ev)) || ((ns::ev) != 0 && ((v) & (ns::ev)))) \
740753 { \
741754 if (s.empty () == false ) \
742- s += " |" ; \
743- s += #ev; \
755+ { \
756+ s += LITERAL_STRING (s, " |" ); \
757+ } \
758+ s += LITERAL_STRING (s, #ev); \
744759 } } while (0 )
745760
746- #define P4VFS_ENUM_TO_STRING_RETURN (v, ns, ev ) \
761+ #define P4VFS_ENUM_TO_STRING_RETURN (rt, v, ns, ev ) \
747762 do { if ((v) == (ns::ev)) \
748763 { \
749- return #ev; \
764+ return LITERAL (rt::value_type, #ev) ; \
750765 } } while (0 )
751766
752767 #define P4VFS_STRING_TO_ENUM_RETURN (v, ns, ev ) \
753- do { if (Microsoft::P4VFS::FileCore::StringInfo::Stricmp (#ev, Microsoft::P4VFS::FileCore::StringInfo::CStr (v)) == 0 ) \
768+ do { if (Microsoft::P4VFS::FileCore::StringInfo::Stricmp (LITERAL_STRING (v, #ev) , Microsoft::P4VFS::FileCore::StringInfo::CStr (v)) == 0 ) \
754769 { \
755770 return ns::ev; \
756771 } } while (0 )
0 commit comments