File: ustring.h

package info (click to toggle)
spring 105.0.1%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 108,860 kB
  • sloc: cpp: 467,785; ansic: 302,607; python: 12,925; java: 12,201; awk: 5,889; sh: 2,371; xml: 655; perl: 405; php: 276; objc: 194; makefile: 75; sed: 2
file content (46 lines) | stat: -rw-r--r-- 1,387 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
/* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */

#ifndef _UNSIGNED_STRING_H
#define _UNSIGNED_STRING_H

#include <string>

typedef unsigned char char8_t;

namespace std {
	class u8string : public string {
	public:
		// copy ctors
		//using string::string; // gcc4.8 and newer
		explicit u8string(const std::string& s) : string(s) {}
		u8string(const char* c) : string(c) {}

		//! this is an important difference, we return an unsigned value here!
		//! std::string returns a _signed_ one and breaks this way:
		//!     std::string("\0xFF")[0] == 0xFF // FAILS!!!
		//!   std::u8string("\0xFF")[0] == 0xFF // WORKS!!!
		//! PS: this is very important with our Color...Indicator cause those
		//!     are defined as unsigned to be compatible with char32_t!
		const char8_t& operator[] (const int t) const {
			auto& str = *static_cast<const std::string*>(this);
			return *reinterpret_cast<const char8_t*>(&str[t]);
		}
	};

	// alternative solution
	// We would need to overload all ctors & funcs with "char*" argument then.
	// too complicated -> the above is less code
	//using u8string = basic_string<char8_t>;
}

static inline const std::u8string& toustring(const std::string& str)
{
	return *static_cast<const std::u8string*>(&str);
}

static inline std::u8string& toustring(std::string& str)
{
	return *static_cast<std::u8string*>(&str);
}

#endif