#ifndef EXTENSIONS_COMMON_EXTENSION_SET_H_
#define EXTENSIONS_COMMON_EXTENSION_SET_H_
#include <iterator>
#include <map>
#include <string>
#include <utility>
#include "base/memory/scoped_refptr.h"
#include "extensions/common/extension.h"
#include "extensions/common/extension_id.h"
class GURL;
namespace extensions {
class URLPatternSet;
class ExtensionSet {
public:
using ExtensionMap = std::map<ExtensionId, scoped_refptr<const Extension>>;
class const_iterator {
public:
using iterator_category = std::input_iterator_tag;
using value_type = scoped_refptr<const Extension>;
using difference_type = std::ptrdiff_t;
using pointer = scoped_refptr<const Extension>*;
using reference = scoped_refptr<const Extension>&;
const_iterator();
const_iterator(const const_iterator& other);
explicit const_iterator(ExtensionMap::const_iterator it);
~const_iterator();
const_iterator& operator++() {
++it_;
return *this;
}
const_iterator operator++(int) {
const const_iterator old(*this);
++it_;
return old;
}
const scoped_refptr<const Extension>& operator*() const {
return it_->second;
}
const scoped_refptr<const Extension>* operator->() const {
return &it_->second;
}
bool operator!=(const const_iterator& other) const {
return it_ != other.it_;
}
bool operator==(const const_iterator& other) const {
return it_ == other.it_;
}
private:
ExtensionMap::const_iterator it_;
};
ExtensionSet();
ExtensionSet(const ExtensionSet&) = delete;
ExtensionSet(ExtensionSet&&);
ExtensionSet& operator=(const ExtensionSet&) = delete;
ExtensionSet& operator=(ExtensionSet&&) noexcept;
~ExtensionSet();
size_t size() const { return extensions_.size(); }
bool empty() const { return extensions_.empty(); }
const_iterator begin() const { return const_iterator(extensions_.begin()); }
const_iterator end() const { return const_iterator(extensions_.end()); }
bool Contains(const ExtensionId& id) const;
bool Insert(const scoped_refptr<const Extension>& extension);
bool InsertAll(const ExtensionSet& extensions);
bool Remove(const ExtensionId& id);
void Clear();
ExtensionId GetExtensionOrAppIDByURL(const GURL& url) const;
const Extension* GetExtensionOrAppByURL(const GURL& url,
bool include_guid = false) const;
const Extension* GetAppByURL(const GURL& url) const;
const Extension* GetHostedAppByURL(const GURL& url) const;
const Extension* GetHostedAppByOverlappingWebExtent(
const URLPatternSet& extent) const;
bool InSameExtent(const GURL& old_url, const GURL& new_url) const;
const Extension* GetByID(const ExtensionId& id) const;
const Extension* GetByGUID(const std::string& guid) const;
const Extension* GetByIDorGUID(const std::string& id_or_guid) const;
ExtensionIdSet GetIDs() const;
bool ExtensionBindingsAllowed(const GURL& url) const;
static ExtensionId GetExtensionIdByURL(const GURL& url);
private:
ExtensionMap extensions_;
};
}
#endif