// Copyright 2014 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_RENDERER_RASTERIZER_SKIA_SKIA_SRC_PORTS_ATOMIC_TYPE_CONVERSIONS_H_
#define COBALT_RENDERER_RASTERIZER_SKIA_SKIA_SRC_PORTS_ATOMIC_TYPE_CONVERSIONS_H_

#include "base/atomicops.h"

// AtomicTraitsBySize determines attributes about a type based on its size,
// sucha as whether or not it is compatible with Chromium's base atomics
// library, and if so, what the corresponding atomic type is.
template <int size>
struct AtomicTraitsBySize {
  static const bool compatible_with_atomics = false;
};

template <>
struct AtomicTraitsBySize<4> {
  static const bool compatible_with_atomics = true;
  typedef base::subtle::Atomic32 atomic_type;
};

#if defined(ARCH_CPU_64_BITS)
template <>
struct AtomicTraitsBySize<8> {
  static const bool compatible_with_atomics = true;
  typedef base::subtle::Atomic64 atomic_type;
};
#endif

// AtomicTraits wraps and has a more natural interface than AtomicTraitsBySize.
template <typename T>
struct AtomicTraits : public AtomicTraitsBySize<sizeof(T)> {};

// Classes for dealing with converting from any given type to its corresponding
// atomic type.
template <typename T>
struct AtomicTypeConversionPolicy {
  typedef typename AtomicTraits<T>::atomic_type type;

  static T FromAtomic(const type& value) { return static_cast<T>(value); }

  static type ToAtomic(const T& value) { return static_cast<type>(value); }
};

// For pointers, we must use reinterpret_cast instead of static_cast.
template <>
struct AtomicTypeConversionPolicy<void*> {
  typedef AtomicTraits<void*>::atomic_type type;

  static void* FromAtomic(const type& value) {
    return reinterpret_cast<void*>(value);
  }

  static type ToAtomic(void* value) { return reinterpret_cast<type>(value); }
};

#endif  // COBALT_RENDERER_RASTERIZER_SKIA_SKIA_SRC_PORTS_ATOMIC_TYPE_CONVERSIONS_H_
