1c7dd295a4e0cc1d15c0c96088e55a85389bade74Ian Rogers/*
2c7dd295a4e0cc1d15c0c96088e55a85389bade74Ian Rogers * Copyright (C) 2011 The Android Open Source Project
3c7dd295a4e0cc1d15c0c96088e55a85389bade74Ian Rogers *
4c7dd295a4e0cc1d15c0c96088e55a85389bade74Ian Rogers * Licensed under the Apache License, Version 2.0 (the "License");
5c7dd295a4e0cc1d15c0c96088e55a85389bade74Ian Rogers * you may not use this file except in compliance with the License.
6c7dd295a4e0cc1d15c0c96088e55a85389bade74Ian Rogers * You may obtain a copy of the License at
7c7dd295a4e0cc1d15c0c96088e55a85389bade74Ian Rogers *
8c7dd295a4e0cc1d15c0c96088e55a85389bade74Ian Rogers *      http://www.apache.org/licenses/LICENSE-2.0
9c7dd295a4e0cc1d15c0c96088e55a85389bade74Ian Rogers *
10c7dd295a4e0cc1d15c0c96088e55a85389bade74Ian Rogers * Unless required by applicable law or agreed to in writing, software
11c7dd295a4e0cc1d15c0c96088e55a85389bade74Ian Rogers * distributed under the License is distributed on an "AS IS" BASIS,
12c7dd295a4e0cc1d15c0c96088e55a85389bade74Ian Rogers * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c7dd295a4e0cc1d15c0c96088e55a85389bade74Ian Rogers * See the License for the specific language governing permissions and
14c7dd295a4e0cc1d15c0c96088e55a85389bade74Ian Rogers * limitations under the License.
15c7dd295a4e0cc1d15c0c96088e55a85389bade74Ian Rogers */
16c7dd295a4e0cc1d15c0c96088e55a85389bade74Ian Rogers
17c7dd295a4e0cc1d15c0c96088e55a85389bade74Ian Rogers#ifndef ART_RUNTIME_BASE_DUMPABLE_H_
18c7dd295a4e0cc1d15c0c96088e55a85389bade74Ian Rogers#define ART_RUNTIME_BASE_DUMPABLE_H_
19c7dd295a4e0cc1d15c0c96088e55a85389bade74Ian Rogers
200e92f4fa0079dad6d1df69abd13054a9885cba98Andreas Gampe#include <ostream>
210e92f4fa0079dad6d1df69abd13054a9885cba98Andreas Gampe
22c7dd295a4e0cc1d15c0c96088e55a85389bade74Ian Rogers#include "base/macros.h"
23c7dd295a4e0cc1d15c0c96088e55a85389bade74Ian Rogers
24c7dd295a4e0cc1d15c0c96088e55a85389bade74Ian Rogersnamespace art {
25c7dd295a4e0cc1d15c0c96088e55a85389bade74Ian Rogers
26c7dd295a4e0cc1d15c0c96088e55a85389bade74Ian Rogers// A convenience to allow any class with a "Dump(std::ostream& os)" member function
27c7dd295a4e0cc1d15c0c96088e55a85389bade74Ian Rogers// but without an operator<< to be used as if it had an operator<<. Use like this:
28c7dd295a4e0cc1d15c0c96088e55a85389bade74Ian Rogers//
29c7dd295a4e0cc1d15c0c96088e55a85389bade74Ian Rogers//   os << Dumpable<MyType>(my_type_instance);
30c7dd295a4e0cc1d15c0c96088e55a85389bade74Ian Rogers//
31c7dd295a4e0cc1d15c0c96088e55a85389bade74Ian Rogerstemplate<typename T>
32c7dd295a4e0cc1d15c0c96088e55a85389bade74Ian Rogersclass Dumpable FINAL {
33c7dd295a4e0cc1d15c0c96088e55a85389bade74Ian Rogers public:
34c7dd295a4e0cc1d15c0c96088e55a85389bade74Ian Rogers  explicit Dumpable(const T& value) : value_(value) {
35c7dd295a4e0cc1d15c0c96088e55a85389bade74Ian Rogers  }
36c7dd295a4e0cc1d15c0c96088e55a85389bade74Ian Rogers
37c7dd295a4e0cc1d15c0c96088e55a85389bade74Ian Rogers  void Dump(std::ostream& os) const {
38c7dd295a4e0cc1d15c0c96088e55a85389bade74Ian Rogers    value_.Dump(os);
39c7dd295a4e0cc1d15c0c96088e55a85389bade74Ian Rogers  }
40c7dd295a4e0cc1d15c0c96088e55a85389bade74Ian Rogers
41c7dd295a4e0cc1d15c0c96088e55a85389bade74Ian Rogers private:
42c7dd295a4e0cc1d15c0c96088e55a85389bade74Ian Rogers  const T& value_;
43c7dd295a4e0cc1d15c0c96088e55a85389bade74Ian Rogers
44c7dd295a4e0cc1d15c0c96088e55a85389bade74Ian Rogers  DISALLOW_COPY_AND_ASSIGN(Dumpable);
45c7dd295a4e0cc1d15c0c96088e55a85389bade74Ian Rogers};
46c7dd295a4e0cc1d15c0c96088e55a85389bade74Ian Rogers
47c7dd295a4e0cc1d15c0c96088e55a85389bade74Ian Rogerstemplate<typename T>
48c7dd295a4e0cc1d15c0c96088e55a85389bade74Ian Rogersstd::ostream& operator<<(std::ostream& os, const Dumpable<T>& rhs) {
49c7dd295a4e0cc1d15c0c96088e55a85389bade74Ian Rogers  rhs.Dump(os);
50c7dd295a4e0cc1d15c0c96088e55a85389bade74Ian Rogers  return os;
51c7dd295a4e0cc1d15c0c96088e55a85389bade74Ian Rogers}
52c7dd295a4e0cc1d15c0c96088e55a85389bade74Ian Rogers
53c7dd295a4e0cc1d15c0c96088e55a85389bade74Ian Rogers}  // namespace art
54c7dd295a4e0cc1d15c0c96088e55a85389bade74Ian Rogers
55c7dd295a4e0cc1d15c0c96088e55a85389bade74Ian Rogers#endif  // ART_RUNTIME_BASE_DUMPABLE_H_
56