output_file.h revision 5f1c94371a64b3196d4be9466099bb892df9b88e
1d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// found in the LICENSE file.
4d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
5d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#ifndef TOOLS_GN_OUTPUT_FILE_H_
6d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#define TOOLS_GN_OUTPUT_FILE_H_
7d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
8d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#include <string>
9d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/containers/hash_tables.h"
11d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#include "tools/gn/build_settings.h"
12d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#include "tools/gn/source_file.h"
13d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
14d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// A simple wrapper around a string that indicates the string is a path
15d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// relative to the output directory.
16d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochclass OutputFile {
17d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch public:
18d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  OutputFile() : value_() {}
19d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  explicit OutputFile(const base::StringPiece& str)
20d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      : value_(str.data(), str.size()) {
21d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
22d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
23d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  std::string& value() { return value_; }
24d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  const std::string& value() const { return value_; }
25d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
26d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  // Converts to a SourceFile by prepending the build directory to the file.
27d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  SourceFile GetSourceFile(const BuildSettings* build_settings) const {
28d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    return SourceFile(build_settings->build_dir().value() + value_);
29d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
30d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
31d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  bool operator==(const OutputFile& other) const {
32d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    return value_ == other.value_;
33d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
34d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  bool operator!=(const OutputFile& other) const {
35d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    return value_ != other.value_;
36d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bool operator<(const OutputFile& other) const {
384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return value_ < other.value_;
394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
40d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
41d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch private:
42d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  std::string value_;
43d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch};
44d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace BASE_HASH_NAMESPACE {
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if defined(COMPILER_GCC)
485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)template<> struct hash<OutputFile> {
495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  std::size_t operator()(const OutputFile& v) const {
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    hash<std::string> h;
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return h(v.value());
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)};
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#elif defined(COMPILER_MSVC)
555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)inline size_t hash_value(const OutputFile& v) {
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return hash_value(v.value());
575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif  // COMPILER...
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}  // namespace BASE_HASH_NAMESPACE
615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)inline void swap(OutputFile& lhs, OutputFile& rhs) {
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  lhs.value().swap(rhs.value());
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif  // TOOLS_GN_OUTPUT_FILE_H_
67