1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef MOJO_PUBLIC_CPP_BINDINGS_STRING_H_
6 #define MOJO_PUBLIC_CPP_BINDINGS_STRING_H_
10 #include "mojo/public/cpp/bindings/lib/array_internal.h"
11 #include "mojo/public/cpp/bindings/type_converter.h"
12 #include "mojo/public/cpp/environment/logging.h"
18 typedef internal::String_Data Data_
;
20 String() : is_null_(true) {}
21 String(const std::string
& str
) : value_(str
), is_null_(false) {}
22 String(const char* chars
) : is_null_(!chars
) {
26 String(const char* chars
, size_t num_chars
)
27 : value_(chars
, num_chars
),
31 String(const char chars
[N
]) : value_(chars
, N
-1), is_null_(false) {}
34 static String
From(const U
& other
) {
35 return TypeConverter
<String
, U
>::ConvertFrom(other
);
40 return TypeConverter
<String
, U
>::ConvertTo(*this);
43 String
& operator=(const std::string
& str
) {
48 String
& operator=(const char* chars
) {
63 bool is_null() const { return is_null_
; }
65 size_t size() const { return value_
.size(); }
67 const char* data() const { return value_
.data(); }
69 const char& at(size_t offset
) const { return value_
.at(offset
); }
70 const char& operator[](size_t offset
) const { return value_
[offset
]; }
72 const std::string
& get() const { return value_
; }
73 operator const std::string
&() const { return value_
; }
75 void Swap(String
* other
) {
76 std::swap(is_null_
, other
->is_null_
);
77 value_
.swap(other
->value_
);
80 void Swap(std::string
* other
) {
86 typedef std::string
String::*Testable
;
89 operator Testable() const { return is_null_
? 0 : &String::value_
; }
96 inline bool operator==(const String
& a
, const String
& b
) {
97 return a
.is_null() == b
.is_null() && a
.get() == b
.get();
99 inline bool operator==(const char* a
, const String
& b
) {
100 return !b
.is_null() && a
== b
.get();
102 inline bool operator==(const String
& a
, const char* b
) {
103 return !a
.is_null() && a
.get() == b
;
105 inline bool operator!=(const String
& a
, const String
& b
) { return !(a
== b
); }
106 inline bool operator!=(const char* a
, const String
& b
) { return !(a
== b
); }
107 inline bool operator!=(const String
& a
, const char* b
) { return !(a
== b
); }
109 inline std::ostream
& operator<<(std::ostream
& out
, const String
& s
) {
110 return out
<< s
.get();
113 // TODO(darin): Add similar variants of operator<,<=,>,>=
116 class TypeConverter
<String
, std::string
> {
118 static String
ConvertFrom(const std::string
& input
) {
119 return String(input
);
121 static std::string
ConvertTo(const String
& input
) {
127 class TypeConverter
<String
, char[N
]> {
129 static String
ConvertFrom(const char input
[N
]) {
131 return String(input
, N
-1);
137 class TypeConverter
<String
, const char[N
]> {
139 static String
ConvertFrom(const char input
[N
]) {
141 return String(input
, N
-1);
146 class TypeConverter
<String
, const char*> {
148 // |input| may be null, in which case a null String will be returned.
149 static String
ConvertFrom(const char* input
) {
150 return String(input
);
156 #endif // MOJO_PUBLIC_CPP_BINDINGS_STRING_H_