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), is_null_(false) {}
28 String(const mojo::String& str)
29 : value_(str.value_), is_null_(str.is_null_) {}
32 String(const char chars[N])
33 : value_(chars, N - 1), is_null_(false) {}
36 static String From(const U& other) {
37 return TypeConverter<String, U>::Convert(other);
42 return TypeConverter<U, String>::Convert(*this);
45 String& operator=(const mojo::String& str) {
47 is_null_ = str.is_null_;
50 String& operator=(const std::string& str) {
55 String& operator=(const char* chars) {
70 bool is_null() const { return is_null_; }
72 size_t size() const { return value_.size(); }
74 const char* data() const { return value_.data(); }
76 const char& at(size_t offset) const { return value_.at(offset); }
77 const char& operator[](size_t offset) const { return value_[offset]; }
79 const std::string& get() const { return value_; }
80 operator const std::string&() const { return value_; }
82 void Swap(String* other) {
83 std::swap(is_null_, other->is_null_);
84 value_.swap(other->value_);
87 void Swap(std::string* other) {
93 typedef std::string String::*Testable;
96 operator Testable() const { return is_null_ ? 0 : &String::value_; }
103 inline bool operator==(const String& a, const String& b) {
104 return a.is_null() == b.is_null() && a.get() == b.get();
106 inline bool operator==(const char* a, const String& b) {
107 return !b.is_null() && a == b.get();
109 inline bool operator==(const String& a, const char* b) {
110 return !a.is_null() && a.get() == b;
112 inline bool operator!=(const String& a, const String& b) {
115 inline bool operator!=(const char* a, const String& b) {
118 inline bool operator!=(const String& a, const char* b) {
122 inline std::ostream& operator<<(std::ostream& out, const String& s) {
123 return out << s.get();
126 inline bool operator<(const String& a, const String& b) {
132 return a.get() < b.get();
135 // TODO(darin): Add similar variants of operator<,<=,>,>=
138 struct TypeConverter<String, std::string> {
139 static String Convert(const std::string& input) { return String(input); }
143 struct TypeConverter<std::string, String> {
144 static std::string Convert(const String& input) { return input; }
148 struct TypeConverter<String, char[N]> {
149 static String Convert(const char input[N]) {
151 return String(input, N - 1);
157 struct TypeConverter<String, const char[N]> {
158 static String Convert(const char input[N]) {
160 return String(input, N - 1);
165 struct TypeConverter<String, const char*> {
166 // |input| may be null, in which case a null String will be returned.
167 static String Convert(const char* input) { return String(input); }
172 #endif // MOJO_PUBLIC_CPP_BINDINGS_STRING_H_