// Copyright 2014 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.

#ifndef MOJO_SERVICES_VIEW_MANAGER_PUBLIC_CPP_VIEW_PROPERTY_H_
#define MOJO_SERVICES_VIEW_MANAGER_PUBLIC_CPP_VIEW_PROPERTY_H_

#include "base/basictypes.h"

// This header should be included by code that defines ViewProperties. It
// should not be included by code that only gets and sets ViewProperties.
//
// To define a new ViewProperty:
//
//  #include "view_manager/public/cpp/view_property.h"
//
//  DECLARE_EXPORTED_VIEW_PROPERTY_TYPE(FOO_EXPORT, MyType);
//  namespace foo {
//    // Use this to define an exported property that is premitive,
//    // or a pointer you don't want automatically deleted.
//    DEFINE_VIEW_PROPERTY_KEY(MyType, kMyKey, MyDefault);
//
//    // Use this to define an exported property whose value is a heap
//    // allocated object, and has to be owned and freed by the view.
//    DEFINE_OWNED_VIEW_PROPERTY_KEY(gfx::Rect, kRestoreBoundsKey, nullptr);
//
//    // Use this to define a non exported property that is primitive,
//    // or a pointer you don't want to automatically deleted, and is used
//    // only in a specific file. This will define the property in an unnamed
//    // namespace which cannot be accessed from another file.
//    DEFINE_LOCAL_VIEW_PROPERTY_KEY(MyType, kMyKey, MyDefault);
//
//  }  // foo namespace
//
// To define a new type used for ViewProperty.
//
//  // outside all namespaces:
//  DECLARE_EXPORTED_VIEW_PROPERTY_TYPE(FOO_EXPORT, MyType)
//
// If a property type is not exported, use DECLARE_VIEW_PROPERTY_TYPE(MyType)
// which is a shorthand for DECLARE_EXPORTED_VIEW_PROPERTY_TYPE(, MyType).

namespace mojo {
namespace {

// No single new-style cast works for every conversion to/from int64, so we
// need this helper class. A third specialization is needed for bool because
// MSVC warning C4800 (forcing value to bool) is not suppressed by an explicit
// cast (!).
template <typename T>
class ViewPropertyCaster {
 public:
  static int64 ToInt64(T x) { return static_cast<int64>(x); }
  static T FromInt64(int64 x) { return static_cast<T>(x); }
};
template <typename T>
class ViewPropertyCaster<T*> {
 public:
  static int64 ToInt64(T* x) { return reinterpret_cast<int64>(x); }
  static T* FromInt64(int64 x) { return reinterpret_cast<T*>(x); }
};
template <>
class ViewPropertyCaster<bool> {
 public:
  static int64 ToInt64(bool x) { return static_cast<int64>(x); }
  static bool FromInt64(int64 x) { return x != 0; }
};

}  // namespace

template <typename T>
struct ViewProperty {
  T default_value;
  const char* name;
  View::PropertyDeallocator deallocator;
};

template <typename T>
void View::SetLocalProperty(const ViewProperty<T>* property, T value) {
  int64 old = SetLocalPropertyInternal(
      property, property->name,
      value == property->default_value ? nullptr : property->deallocator,
      ViewPropertyCaster<T>::ToInt64(value),
      ViewPropertyCaster<T>::ToInt64(property->default_value));
  if (property->deallocator &&
      old != ViewPropertyCaster<T>::ToInt64(property->default_value)) {
    (*property->deallocator)(old);
  }
}

template <typename T>
T View::GetLocalProperty(const ViewProperty<T>* property) const {
  return ViewPropertyCaster<T>::FromInt64(GetLocalPropertyInternal(
      property, ViewPropertyCaster<T>::ToInt64(property->default_value)));
}

template <typename T>
void View::ClearLocalProperty(const ViewProperty<T>* property) {
  SetLocalProperty(property, property->default_value);
}

}  // namespace mojo

// Macros to instantiate the property getter/setter template functions.
#define DECLARE_EXPORTED_VIEW_PROPERTY_TYPE(EXPORT, T)                         \
  template EXPORT void mojo::View::SetLocalProperty(                           \
      const mojo::ViewProperty<T>*, T);                                        \
  template EXPORT T mojo::View::GetLocalProperty(const mojo::ViewProperty<T>*) \
      const;                                                                   \
  template EXPORT void mojo::View::ClearLocalProperty(                         \
      const mojo::ViewProperty<T>*);
#define DECLARE_VIEW_PROPERTY_TYPE(T) DECLARE_EXPORTED_VIEW_PROPERTY_TYPE(, T)

#define DEFINE_VIEW_PROPERTY_KEY(TYPE, NAME, DEFAULT)                      \
  COMPILE_ASSERT(sizeof(TYPE) <= sizeof(int64), property_type_too_large);  \
  namespace {                                                              \
  const mojo::ViewProperty<TYPE> NAME##_Value = {DEFAULT, #NAME, nullptr}; \
  }                                                                        \
  const mojo::ViewProperty<TYPE>* const NAME = &NAME##_Value;

#define DEFINE_LOCAL_VIEW_PROPERTY_KEY(TYPE, NAME, DEFAULT)                \
  COMPILE_ASSERT(sizeof(TYPE) <= sizeof(int64), property_type_too_large);  \
  namespace {                                                              \
  const mojo::ViewProperty<TYPE> NAME##_Value = {DEFAULT, #NAME, nullptr}; \
  const mojo::ViewProperty<TYPE>* const NAME = &NAME##_Value;              \
  }

#define DEFINE_OWNED_VIEW_PROPERTY_KEY(TYPE, NAME, DEFAULT)            \
  namespace {                                                          \
  void Deallocator##NAME(int64 p) {                                    \
    enum { type_must_be_complete = sizeof(TYPE) };                     \
    delete mojo::ViewPropertyCaster<TYPE*>::FromInt64(p);              \
  }                                                                    \
  const mojo::ViewProperty<TYPE*> NAME##_Value = {DEFAULT,             \
                                                  #NAME,               \
                                                  &Deallocator##NAME}; \
  }                                                                    \
  const mojo::ViewProperty<TYPE*>* const NAME = &NAME##_Value;

#endif  // MOJO_SERVICES_VIEW_MANAGER_PUBLIC_CPP_VIEW_PROPERTY_H_
