| Index: base/trace_event/memory_allocator_attributes_type_info.cc
 | 
| diff --git a/base/trace_event/memory_allocator_attributes_type_info.cc b/base/trace_event/memory_allocator_attributes_type_info.cc
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..7d1e61cada7f3423a2d48e7b188fbf13b8195f2c
 | 
| --- /dev/null
 | 
| +++ b/base/trace_event/memory_allocator_attributes_type_info.cc
 | 
| @@ -0,0 +1,61 @@
 | 
| +// Copyright 2015 The Chromium Authors. All rights reserved.
 | 
| +// Use of this source code is governed by a BSD-style license that can be
 | 
| +// found in the LICENSE file.
 | 
| +
 | 
| +#include "base/trace_event/memory_allocator_attributes_type_info.h"
 | 
| +
 | 
| +#include "base/lazy_instance.h"
 | 
| +#include "base/logging.h"
 | 
| +
 | 
| +namespace base {
 | 
| +namespace trace_event {
 | 
| +
 | 
| +namespace {
 | 
| +base::LazyInstance<const std::string> kNotFound = LAZY_INSTANCE_INITIALIZER;
 | 
| +
 | 
| +std::string GetKey(const std::string& allocator_name,
 | 
| +                   const std::string& attribute_name) {
 | 
| +  return allocator_name + "/" + attribute_name;
 | 
| +}
 | 
| +}  // namespace
 | 
| +
 | 
| +MemoryAllocatorAttributesTypeInfo::MemoryAllocatorAttributesTypeInfo() {
 | 
| +}
 | 
| +
 | 
| +MemoryAllocatorAttributesTypeInfo::~MemoryAllocatorAttributesTypeInfo() {
 | 
| +}
 | 
| +
 | 
| +const std::string& MemoryAllocatorAttributesTypeInfo::Get(
 | 
| +    const std::string& allocator_name,
 | 
| +    const std::string& attribute_name) const {
 | 
| +  auto it = type_info_map_.find(GetKey(allocator_name, attribute_name));
 | 
| +  if (it == type_info_map_.end())
 | 
| +    return kNotFound.Get();
 | 
| +  return it->second;
 | 
| +}
 | 
| +
 | 
| +void MemoryAllocatorAttributesTypeInfo::Set(const std::string& allocator_name,
 | 
| +                                            const std::string& attribute_name,
 | 
| +                                            const std::string& attribute_type) {
 | 
| +  std::string key = GetKey(allocator_name, attribute_name);
 | 
| +  DCHECK_EQ(0u, type_info_map_.count(key));
 | 
| +  type_info_map_[key] = attribute_type;
 | 
| +}
 | 
| +
 | 
| +bool MemoryAllocatorAttributesTypeInfo::Exists(
 | 
| +    const std::string& allocator_name,
 | 
| +    const std::string& attribute_name) const {
 | 
| +  return type_info_map_.count(GetKey(allocator_name, attribute_name)) == 1;
 | 
| +}
 | 
| +
 | 
| +void MemoryAllocatorAttributesTypeInfo::Update(
 | 
| +    const MemoryAllocatorAttributesTypeInfo& other) {
 | 
| +  for (auto it = other.type_info_map_.begin();
 | 
| +       it != other.type_info_map_.end(); ++it) {
 | 
| +    bool no_duplicates = type_info_map_.insert(*it).second;
 | 
| +    DCHECK(no_duplicates) << "Duplicated allocator attribute " << it->first;
 | 
| +  }
 | 
| +}
 | 
| +
 | 
| +}  // namespace trace_event
 | 
| +}  // namespace base
 | 
| 
 |