// Copyright 2016 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef COBALT_LOADER_FONT_REMOTE_TYPEFACE_CACHE_H_
#define COBALT_LOADER_FONT_REMOTE_TYPEFACE_CACHE_H_

#include <string>

#include "cobalt/loader/loader_factory.h"
#include "cobalt/loader/resource_cache.h"
#include "cobalt/render_tree/typeface.h"

namespace cobalt {

namespace render_tree {

class Typeface;

}  // render_tree

namespace loader {
namespace font {

// |RemoteTypefaceResourceCacheType| provides the types and implements the
// functions required by |ResourceCache<CacheType>|
struct RemoteTypefaceResourceCacheType {
  typedef render_tree::Typeface ResourceType;

  static uint32 GetEstimatedSizeInBytes(
      const scoped_refptr<ResourceType>& resource) {
    return resource->GetEstimatedSizeInBytes();
  }
};

typedef CachedResource<RemoteTypefaceResourceCacheType> CachedRemoteTypeface;
typedef CachedResourceReferenceWithCallbacks<RemoteTypefaceResourceCacheType>
    CachedRemoteTypefaceReferenceWithCallbacks;
typedef CachedRemoteTypefaceReferenceWithCallbacks::
    CachedResourceReferenceVector CachedRemoteTypefaceReferenceVector;

typedef ResourceCache<RemoteTypefaceResourceCacheType> RemoteTypefaceCache;

// CreateTypefaceCache() provides a mechanism for creating a remote typeface
// cache.
inline static scoped_ptr<RemoteTypefaceCache> CreateRemoteTypefaceCache(
    const std::string& name, uint32 cache_capacity,
    loader::LoaderFactory* loader_factory) {
  return make_scoped_ptr<RemoteTypefaceCache>(new RemoteTypefaceCache(
      name, cache_capacity,
      base::Bind(&loader::LoaderFactory::CreateTypefaceLoader,
                 base::Unretained(loader_factory))));
}

}  // namespace font
}  // namespace loader
}  // namespace cobalt

#endif  // COBALT_LOADER_FONT_REMOTE_TYPEFACE_CACHE_H_
