1// Copyright (c) 2013 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.
4
5#ifndef TOOLS_GN_STRING_UTILS_H_
6#define TOOLS_GN_STRING_UTILS_H_
7
8#include "base/strings/string_piece.h"
9
10class Err;
11class Scope;
12class Token;
13class Value;
14
15inline std::string operator+(const std::string& a, const base::StringPiece& b) {
16  std::string ret;
17  ret.reserve(a.size() + b.size());
18  ret.assign(a);
19  ret.append(b.data(), b.size());
20  return ret;
21}
22
23inline std::string operator+(const base::StringPiece& a, const std::string& b) {
24  std::string ret;
25  ret.reserve(a.size() + b.size());
26  ret.assign(a.data(), a.size());
27  ret.append(b);
28  return ret;
29}
30
31// Unescapes and expands variables in the given literal, writing the result
32// to the given value. On error, sets |err| and returns false.
33bool ExpandStringLiteral(Scope* scope,
34                         const Token& literal,
35                         Value* result,
36                         Err* err);
37
38// Removes the given prefix from the string. Asserts if the string does
39// not have the given prefix.
40//
41// Note: could potentially return a StringPiece into the str.
42std::string RemovePrefix(const std::string& str, const std::string& prefix);
43
44// Appends the given string piece to the given string. This avoids an
45// intermediate copy.
46inline void AppendStringPiece(std::string* dest,
47                              const base::StringPiece& piece) {
48  dest->append(piece.data(), piece.size());
49}
50
51// Removes the trailing slash from the given string. This asserts that either
52// the string is empty or it ends with a slash (normally used to process
53// directories).
54void TrimTrailingSlash(std::string* str);
55
56#endif  // TOOLS_GN_STRING_UTILS_H_
57