@@ -1913,6 +1913,68 @@ RegisterOperators reg2({
19131913 Operator (
19141914 " aten::slice(str string, int start, int end=9223372036854775807, int step=1) -> str" ,
19151915 stringSlice),
1916+
1917+ // python string is methods return false if empty
1918+ #define DEFINE_STRING_IS_OP (op_name, char_op ) \
1919+ Operator (#op_name " (str self) -> bool" , [](Stack& stack) { \
1920+ auto string = pop (stack).toStringRef (); \
1921+ push ( \
1922+ stack, \
1923+ string.size () != 0 && \
1924+ std::all_of (string.begin (), string.end (), [](char c) { \
1925+ return char_op (c); \
1926+ })); \
1927+ return 0 ; \
1928+ })
1929+
1930+ // upper and lower require there to be at least one alpha character,
1931+ // and ignore all other characters
1932+ Operator (
1933+ " aten::isupper(str self) -> bool" ,
1934+ [](Stack& stack) {
1935+ auto string = pop (stack).toStringRef ();
1936+ bool found_alpha = false ;
1937+ bool is_upper = true ;
1938+ for (char c : string) {
1939+ found_alpha |= std::isalpha (c);
1940+ is_upper &= (!std::isalpha (c) || std::isupper (c));
1941+ }
1942+ push (stack, found_alpha && is_upper);
1943+ return 0 ;
1944+ }),
1945+ Operator (
1946+ " aten::islower(str self) -> bool" ,
1947+ [](Stack& stack) {
1948+ auto string = pop (stack).toStringRef ();
1949+ bool found_alpha = false ;
1950+ bool is_lower = true ;
1951+ for (char c : string) {
1952+ found_alpha |= std::isalpha (c);
1953+ is_lower &= (!std::isalpha (c) || std::islower (c));
1954+ }
1955+ push (stack, found_alpha && is_lower);
1956+ return 0 ;
1957+ }),
1958+
1959+ DEFINE_STRING_IS_OP (aten::isdigit, std::isdigit),
1960+ DEFINE_STRING_IS_OP (aten::isspace, std::isspace),
1961+ DEFINE_STRING_IS_OP (aten::isalnum, std::isalnum),
1962+ DEFINE_STRING_IS_OP (aten::isalpha, std::isalpha),
1963+
1964+ #define DEFINE_STRING_CHAR_MAP_OP (op_name, char_op ) \
1965+ Operator (#op_name " (str self) -> str" , [](Stack& stack) { \
1966+ auto string = pop (stack).toStringRef (); \
1967+ std::stringstream ss; \
1968+ for (char c : string) { \
1969+ ss << static_cast <char >(char_op (c)); \
1970+ } \
1971+ push (stack, ss.str ()); \
1972+ return 0 ; \
1973+ })
1974+
1975+ DEFINE_STRING_CHAR_MAP_OP (aten::upper, std::toupper),
1976+ DEFINE_STRING_CHAR_MAP_OP (aten::lower, std::tolower),
1977+
19161978 Operator (
19171979 " prim::StringIndex(str string, int index) -> str" ,
19181980 [](Stack& stack) {
0 commit comments