-- 5a5dba4252e764e6737070bf0a31074bf23a3b41 by Abseil Team <absl-team@google.com>: Internal change. PiperOrigin-RevId: 244898913 -- 3eb7d5b445ffbf08a104e39cd15aecf568417333 by Matt Calabrese <calabrese@google.com>: Introduce absl::is_trivially_move_constructible and absl::is_trivially_move_assignable, and update the absl::is_trivially_copy_constructible and absl::is_trivially_copy_assignable traits to use similar techniques (should now be closer to the standard behavior). PiperOrigin-RevId: 244859015 -- 7da05a24fa786cab3985de0c39a186d73dcbcfb5 by Abseil Team <absl-team@google.com>: Fix misspellings in comments in raw_hash_set.h. PiperOrigin-RevId: 244754700 -- 5c057be96048f21473d5ec45005ab4dcd8dd354f by Derek Mauro <dmauro@google.com>: Internal change PiperOrigin-RevId: 244744239 -- 592394e3c2e98f1238d3fb6fcb0d20c3e3739ba9 by Derek Mauro <dmauro@google.com>: Limit the raw_hash_set prefetch test to x86-64. PiperOrigin-RevId: 244737534 -- 99ebe4e003633c8ff7838b035b31a827994879ef by Derek Mauro <dmauro@google.com>: Workaround warning 4091 in an MSVC header. PiperOrigin-RevId: 244701744 -- 0aa23f09a32efe7985ee55b0217190f08da42477 by Abseil Team <absl-team@google.com>: Fix comment typo. PiperOrigin-RevId: 244659371 -- c6cdb87e9f28062c8daa29b3d8d68182ecc16383 by Derek Mauro <dmauro@google.com>: Fix -Wundef warnings and support -Wundef. PiperOrigin-RevId: 244244968 -- 06b81245f7696b20c3c63b0618d33ac25e29cad6 by Abseil Team <absl-team@google.com>: Fix a typo in inlined_vector.h. PiperOrigin-RevId: 244230809 -- 94877a2125d2cfe837384240e4d6551f39d737e4 by Greg Falcon <gfalcon@google.com>: Fix sysinfo_test for emscripten. PiperOrigin-RevId: 244198804 -- ec7783531ef7f9df2da37d341d61f7cb2bf843f0 by Shaindel Schwartz <shaindel@google.com>: Import of CCTZ from GitHub. Fixes #291. PiperOrigin-RevId: 244184598 -- b652c14fa95ea206c217487ee713b11f5d1762b3 by Matt Calabrese <calabrese@google.com>: Emulate the `in_place_index` and `in_place_type` variable templates such that they are syntactically usable in C++11 with `any` and `variant`. Also pull in the variable templates from namespace std when available. The main observable differences here are: 1) The types of `in_place_index_t<I>` and `in_place_type_t<T>` become function pointer types rather than structs when using the implementation that is not an alias of the std equivalents. 2) The types of `in_place_index<I>` and `in_place_type<T>` are not directly `in_place_index_t<I>` and `in_place_type_t<T>`, but rather they become function types that decay to the corresponding function pointer types. 3) The default constructor for `in_place_index_t` and `in_place_type_t` instantiations is no longer explicit, but for these templates I think that's less important than for something like `in_place_t` since the _type_t and _index_t versions basically never have their template parameter non-deduced when participating in overload resolution with conflicting candidates. 4) While idiomatic usage of `in_place_type_t` and `in_place_index_t` with std::variant and std::any should not be affected, there is the possibility that strange, non-idiomatic uses may be affected in the wild. 5) Default construction (rather than value-initialization) leads to a default-constructed pointer. PiperOrigin-RevId: 244180003 -- b9ac5a96581837ffa24532117b7ea302a5569751 by Derek Mauro <dmauro@google.com>: Fix MSVC debug assertion. isprint is undefined for values not representable as unsigned char or EOF. PiperOrigin-RevId: 244083005 -- 41758be6137c2f25e84b50f23938e49484be2903 by Shaindel Schwartz <shaindel@google.com>: Update config settings for Apple platforms. PiperOrigin-RevId: 244040587 -- c90df6a26db94b0305a0c954455a621542a89d91 by Abseil Team <absl-team@google.com>: Internal change PiperOrigin-RevId: 244024427 -- c71e9ceb89495354eca7d02bd905ffeaa9029aec by Derek Mauro <dmauro@google.com>: Adds missing ABSL_DEFAULT_COPTS and ABSL_TEST_COPTS to CMakeLists.txt Don't error on deprecated declarations in tests. It is completely reasonable to test that code marked deprecated still works. PiperOrigin-RevId: 244003941 -- e1326a96527a8ba9b8d120161545260da9c4562e by Abseil Team <absl-team@google.com>: Internal change. PiperOrigin-RevId: 243990623 -- 90b8e12934c7711e1bfcc0117d21288bf9220dee by Abseil Team <absl-team@google.com>: Add variation of absl::Base64Escape/WebSafeBase64Escape that directly returns its result. PiperOrigin-RevId: 243894308 -- 317fef3344481ebc5c35712d42f5d8a0fa64dff4 by Abseil Team <absl-team@google.com>: Enable raw logging in Emscripten builds. PiperOrigin-RevId: 243893705 GitOrigin-RevId: 5a5dba4252e764e6737070bf0a31074bf23a3b41 Change-Id: I19293aab73cc98d9e9bf6a9fdc30819764adb9db
		
			
				
	
	
		
			162 lines
		
	
	
	
		
			6.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			162 lines
		
	
	
	
		
			6.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| //
 | |
| // Copyright 2017 The Abseil Authors.
 | |
| //
 | |
| // Licensed under the Apache License, Version 2.0 (the "License");
 | |
| // you may not use this file except in compliance with the License.
 | |
| // You may obtain a copy of the License at
 | |
| //
 | |
| //      https://www.apache.org/licenses/LICENSE-2.0
 | |
| //
 | |
| // Unless required by applicable law or agreed to in writing, software
 | |
| // distributed under the License is distributed on an "AS IS" BASIS,
 | |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | |
| // See the License for the specific language governing permissions and
 | |
| // limitations under the License.
 | |
| //
 | |
| // -----------------------------------------------------------------------------
 | |
| // File: escaping.h
 | |
| // -----------------------------------------------------------------------------
 | |
| //
 | |
| // This header file contains string utilities involved in escaping and
 | |
| // unescaping strings in various ways.
 | |
| 
 | |
| #ifndef ABSL_STRINGS_ESCAPING_H_
 | |
| #define ABSL_STRINGS_ESCAPING_H_
 | |
| 
 | |
| #include <cstddef>
 | |
| #include <string>
 | |
| #include <vector>
 | |
| 
 | |
| #include "absl/base/macros.h"
 | |
| #include "absl/strings/ascii.h"
 | |
| #include "absl/strings/str_join.h"
 | |
| #include "absl/strings/string_view.h"
 | |
| 
 | |
| namespace absl {
 | |
| 
 | |
| // CUnescape()
 | |
| //
 | |
| // Unescapes a `source` string and copies it into `dest`, rewriting C-style
 | |
| // escape sequences (https://en.cppreference.com/w/cpp/language/escape) into
 | |
| // their proper code point equivalents, returning `true` if successful.
 | |
| //
 | |
| // The following unescape sequences can be handled:
 | |
| //
 | |
| //   * ASCII escape sequences ('\n','\r','\\', etc.) to their ASCII equivalents
 | |
| //   * Octal escape sequences ('\nnn') to byte nnn. The unescaped value must
 | |
| //     resolve to a single byte or an error will occur. E.g. values greater than
 | |
| //     0xff will produce an error.
 | |
| //   * Hexadecimal escape sequences ('\xnn') to byte nn. While an arbitrary
 | |
| //     number of following digits are allowed, the unescaped value must resolve
 | |
| //     to a single byte or an error will occur. E.g. '\x0045' is equivalent to
 | |
| //     '\x45', but '\x1234' will produce an error.
 | |
| //   * Unicode escape sequences ('\unnnn' for exactly four hex digits or
 | |
| //     '\Unnnnnnnn' for exactly eight hex digits, which will be encoded in
 | |
| //     UTF-8. (E.g., `\u2019` unescapes to the three bytes 0xE2, 0x80, and
 | |
| //     0x99).
 | |
| //
 | |
| // If any errors are encountered, this function returns `false`, leaving the
 | |
| // `dest` output parameter in an unspecified state, and stores the first
 | |
| // encountered error in `error`. To disable error reporting, set `error` to
 | |
| // `nullptr` or use the overload with no error reporting below.
 | |
| //
 | |
| // Example:
 | |
| //
 | |
| //   std::string s = "foo\\rbar\\nbaz\\t";
 | |
| //   std::string unescaped_s;
 | |
| //   if (!absl::CUnescape(s, &unescaped_s) {
 | |
| //     ...
 | |
| //   }
 | |
| //   EXPECT_EQ(unescaped_s, "foo\rbar\nbaz\t");
 | |
| bool CUnescape(absl::string_view source, std::string* dest, std::string* error);
 | |
| 
 | |
| // Overload of `CUnescape()` with no error reporting.
 | |
| inline bool CUnescape(absl::string_view source, std::string* dest) {
 | |
|   return CUnescape(source, dest, nullptr);
 | |
| }
 | |
| 
 | |
| // CEscape()
 | |
| //
 | |
| // Escapes a 'src' string using C-style escapes sequences
 | |
| // (https://en.cppreference.com/w/cpp/language/escape), escaping other
 | |
| // non-printable/non-whitespace bytes as octal sequences (e.g. "\377").
 | |
| //
 | |
| // Example:
 | |
| //
 | |
| //   std::string s = "foo\rbar\tbaz\010\011\012\013\014\x0d\n";
 | |
| //   std::string escaped_s = absl::CEscape(s);
 | |
| //   EXPECT_EQ(escaped_s, "foo\\rbar\\tbaz\\010\\t\\n\\013\\014\\r\\n");
 | |
| std::string CEscape(absl::string_view src);
 | |
| 
 | |
| // CHexEscape()
 | |
| //
 | |
| // Escapes a 'src' string using C-style escape sequences, escaping
 | |
| // other non-printable/non-whitespace bytes as hexadecimal sequences (e.g.
 | |
| // "\xFF").
 | |
| //
 | |
| // Example:
 | |
| //
 | |
| //   std::string s = "foo\rbar\tbaz\010\011\012\013\014\x0d\n";
 | |
| //   std::string escaped_s = absl::CHexEscape(s);
 | |
| //   EXPECT_EQ(escaped_s, "foo\\rbar\\tbaz\\x08\\t\\n\\x0b\\x0c\\r\\n");
 | |
| std::string CHexEscape(absl::string_view src);
 | |
| 
 | |
| // Utf8SafeCEscape()
 | |
| //
 | |
| // Escapes a 'src' string using C-style escape sequences, escaping bytes as
 | |
| // octal sequences, and passing through UTF-8 characters without conversion.
 | |
| // I.e., when encountering any bytes with their high bit set, this function
 | |
| // will not escape those values, whether or not they are valid UTF-8.
 | |
| std::string Utf8SafeCEscape(absl::string_view src);
 | |
| 
 | |
| // Utf8SafeCHexEscape()
 | |
| //
 | |
| // Escapes a 'src' string using C-style escape sequences, escaping bytes as
 | |
| // hexadecimal sequences, and passing through UTF-8 characters without
 | |
| // conversion.
 | |
| std::string Utf8SafeCHexEscape(absl::string_view src);
 | |
| 
 | |
| // Base64Unescape()
 | |
| //
 | |
| // Converts a `src` string encoded in Base64 to its binary equivalent, writing
 | |
| // it to a `dest` buffer, returning `true` on success. If `src` contains invalid
 | |
| // characters, `dest` is cleared and returns `false`.
 | |
| bool Base64Unescape(absl::string_view src, std::string* dest);
 | |
| 
 | |
| // WebSafeBase64Unescape()
 | |
| //
 | |
| // Converts a `src` string encoded in Base64 to its binary equivalent, writing
 | |
| // it to a `dest` buffer, but using '-' instead of '+', and '_' instead of '/'.
 | |
| // If `src` contains invalid characters, `dest` is cleared and returns `false`.
 | |
| bool WebSafeBase64Unescape(absl::string_view src, std::string* dest);
 | |
| 
 | |
| // Base64Escape()
 | |
| //
 | |
| // Encodes a `src` string into a base64-encoded string, with padding characters.
 | |
| // This function conforms with RFC 4648 section 4 (base64).
 | |
| void Base64Escape(absl::string_view src, std::string* dest);
 | |
| std::string Base64Escape(absl::string_view src);
 | |
| 
 | |
| // WebSafeBase64Escape()
 | |
| //
 | |
| // Encodes a `src` string into a base64-like string, using '-' instead of '+'
 | |
| // and '_' instead of '/', and without padding. This function conforms with RFC
 | |
| // 4648 section 5 (base64url).
 | |
| void WebSafeBase64Escape(absl::string_view src, std::string* dest);
 | |
| std::string WebSafeBase64Escape(absl::string_view src);
 | |
| 
 | |
| // HexStringToBytes()
 | |
| //
 | |
| // Converts an ASCII hex string into bytes, returning binary data of length
 | |
| // `from.size()/2`.
 | |
| std::string HexStringToBytes(absl::string_view from);
 | |
| 
 | |
| // BytesToHexString()
 | |
| //
 | |
| // Converts binary data into an ASCII text string, returning a string of size
 | |
| // `2*from.size()`.
 | |
| std::string BytesToHexString(absl::string_view from);
 | |
| 
 | |
| }  // namespace absl
 | |
| 
 | |
| #endif  // ABSL_STRINGS_ESCAPING_H_
 |