// Copyright 2015 The Cobalt Authors. 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_SCRIPT_UNION_TYPE_INTERNAL_H_
#define COBALT_SCRIPT_UNION_TYPE_INTERNAL_H_

// Details of union type implementation. See union_type.h

#include <limits>
#include <string>

#include "base/memory/ref_counted.h"
#include "base/optional.h"
#include "cobalt/base/enable_if.h"
#include "cobalt/base/type_id.h"
#include "cobalt/script/array_buffer_view.h"
#include "cobalt/script/sequence.h"

namespace cobalt {
namespace script {
namespace internal {

template <typename T>
struct UnionTypeDefaultTraits {
  typedef const T& ArgType;
  typedef T& ReturnType;
  typedef const T& ConstReturnType;
  static base::TypeId GetTypeID() { return base::GetTypeId<T>(); }
  static const bool is_boolean_type = false;
  static const bool is_interface_type = false;
  static const bool is_numeric_type = false;
  static const bool is_sequence_type = false;
  static const bool is_string_type = false;
  // e.g. ScriptValue<Uint8Array>* needs to be casted to
  // ScriptValue<ArrayBufferView>* manually.
  static const bool is_array_buffer_view_type = false;
  static const bool is_script_value_type = false;
};

// Default traits for types with no specialization
template <typename T, typename = void>
struct UnionTypeTraits : UnionTypeDefaultTraits<T> {
  // This assert will only be evaluated if the template is instantiated.
  COMPILE_ASSERT(sizeof(T) == 0, UnionTypeNotImplementedForType);
};

template <typename T>
struct UnionTypeTraits<scoped_refptr<T> >
    : UnionTypeDefaultTraits<scoped_refptr<T> > {
  static base::TypeId GetTypeID() { return base::GetTypeId<T>(); }
  static const bool is_interface_type = true;
};

template <>
struct UnionTypeTraits<Handle<ArrayBufferView>>
    : UnionTypeDefaultTraits<Handle<ArrayBufferView>> {
  static const bool is_array_buffer_view_type = true;
};

// script::Handle is always used to hold ScriptValues.
template <typename T>
struct UnionTypeTraits<Handle<T>> : UnionTypeDefaultTraits<Handle<T>> {
  static const bool is_script_value_type = true;
};

template <>
struct UnionTypeTraits<std::string> : UnionTypeDefaultTraits<std::string> {
  static const bool is_string_type = true;
};

// std::numeric_limits<T>::digits will be 0 for non-specialized types, 1 for
// bool, and something larger for the other types.
template <typename T>
struct UnionTypeTraits<
    T, typename base::enable_if<(std::numeric_limits<T>::digits > 1)>::type>
    : UnionTypeDefaultTraits<T> {
  typedef T ArgType;
  typedef T ReturnType;
  typedef T ConstReturnType;
  static const bool is_numeric_type = true;
};

template <>
struct UnionTypeTraits<bool> : UnionTypeDefaultTraits<bool> {
  typedef bool ArgType;
  typedef bool ReturnType;
  typedef bool ConstReturnType;
  static const bool is_boolean_type = true;
};

template <typename T>
struct UnionTypeTraits<Sequence<T>> : UnionTypeDefaultTraits<Sequence<T>> {
  typedef const Sequence<T>& ArgType;
  typedef Sequence<T> ReturnType;
  typedef const Sequence<T>& ConstReturnType;
  static const bool is_sequence_type = true;
};

// Explicitly blacklist nullable types. None of the union members should be
// nullable. If the union has a nullable member, then the whole union type
// should be declared nullable such as base::Optional<base::UnionTypeN<...> >
template <typename T>
struct UnionTypeTraits<base::Optional<T>> : UnionTypeDefaultTraits<T> {
  // This assert will only be evaluated if the template is instantiated.
  COMPILE_ASSERT(sizeof(T) == 0, NullableTypesAreNotPermittedInUnionss);
};

}  // namespace internal
}  // namespace script
}  // namespace cobalt

#endif  // COBALT_SCRIPT_UNION_TYPE_INTERNAL_H_
