// Copyright (c) 2011 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/property_bag.h"

#include "base/memory/linked_ptr.h"

namespace base {

PropertyBag::PropertyBag() {
}

PropertyBag::PropertyBag(const PropertyBag& other) {
  operator=(other);
}

PropertyBag::~PropertyBag() {
}

PropertyBag& PropertyBag::operator=(const PropertyBag& other) {
  props_.clear();

  // We need to make copies of each property using the virtual copy() method.
  for (PropertyMap::const_iterator i = other.props_.begin();
       i != other.props_.end(); ++i)
    props_[i->first] = linked_ptr<Prop>(i->second->copy());
  return *this;
}

void PropertyBag::SetProperty(PropID id, Prop* prop) {
  props_[id] = linked_ptr<Prop>(prop);
}

PropertyBag::Prop* PropertyBag::GetProperty(PropID id) {
  PropertyMap::const_iterator found = props_.find(id);
  if (found == props_.end())
    return NULL;
  return found->second.get();
}

const PropertyBag::Prop* PropertyBag::GetProperty(PropID id) const {
  PropertyMap::const_iterator found = props_.find(id);
  if (found == props_.end())
    return NULL;
  return found->second.get();
}

void PropertyBag::DeleteProperty(PropID id) {
  PropertyMap::iterator found = props_.find(id);
  if (found == props_.end())
    return;  // Not found, nothing to do.
  props_.erase(found);
}

PropertyAccessorBase::PropertyAccessorBase() {
  static PropertyBag::PropID next_id = 1;
  prop_id_ = next_id++;
}

}  // namespace base
