13d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nissler/*
23d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nissler * Copyright (C) 2016 The Android Open Source Project
33d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nissler *
43d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nissler * Licensed under the Apache License, Version 2.0 (the "License");
53d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nissler * you may not use this file except in compliance with the License.
63d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nissler * You may obtain a copy of the License at
73d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nissler *
83d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nissler *      http://www.apache.org/licenses/LICENSE-2.0
93d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nissler *
103d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nissler * Unless required by applicable law or agreed to in writing, software
113d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nissler * distributed under the License is distributed on an "AS IS" BASIS,
123d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nissler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nissler * See the License for the specific language governing permissions and
143d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nissler * limitations under the License.
153d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nissler */
163d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nissler
17a715cb1840f9a0c813c90707a351687f7a77950eMattias Nissler#ifndef NVRAM_MESSAGES_TYPE_TRAITS_H_
18a715cb1840f9a0c813c90707a351687f7a77950eMattias Nissler#define NVRAM_MESSAGES_TYPE_TRAITS_H_
193d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nissler
203d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nisslerextern "C" {
213d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nissler#include <stddef.h>
223d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nissler}
233d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nissler
243d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nissler// A subset of utilities similar to what is available in <type_traits>. We have
253d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nissler// our own standalone version here since not all target platforms have a full
263d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nissler// C++ standard library.
273d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nissler
283d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nisslernamespace nvram {
293d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nissler
303d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nisslertemplate <typename T>
313d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nisslerstruct remove_const {
323d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nissler  using Type = T;
333d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nissler};
343d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nisslertemplate <typename T>
353d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nisslerstruct remove_const<const T> {
363d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nissler  using Type = T;
373d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nissler};
383d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nissler
393d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nisslertemplate <typename T>
403d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nisslerstruct remove_reference {
413d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nissler  using Type = T;
423d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nissler};
433d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nisslertemplate <typename T>
443d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nisslerstruct remove_reference<T&> {
453d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nissler  using Type = T;
463d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nissler};
473d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nisslertemplate <typename T>
483d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nisslerstruct remove_reference<T&&> {
493d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nissler  using Type = T;
503d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nissler};
513d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nissler
523d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nisslertemplate <bool value, typename T = void>
533d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nisslerstruct enable_if {};
543d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nissler
553d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nisslertemplate <typename T>
563d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nisslerstruct enable_if<true, T> {
573d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nissler  using Type = T;
583d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nissler};
593d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nissler
603d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nisslertemplate <typename T, T const_value>
613d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nisslerstruct integral_constant {
623d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nissler  static constexpr T value = const_value;
633d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nissler};
643d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nissler
653d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nisslerusing true_type = integral_constant<bool, true>;
663d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nisslerusing false_type = integral_constant<bool, false>;
673d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nissler
683d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nisslertemplate <typename T>
693d2f13f288feb42f1dfcfe558af27955edefaad3Mattias NisslerT declval();
703d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nissler
713d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nisslertemplate <size_t... index>
723d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nisslerstruct index_sequence {};
733d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nissler
743d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nisslertemplate <size_t size, size_t... indices>
753d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nisslerstruct make_index_sequence_builder {
763d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nissler  using Type = typename make_index_sequence_builder<size - 1,
773d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nissler                                                    size - 1,
783d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nissler                                                    indices...>::Type;
793d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nissler};
803d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nissler
813d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nisslertemplate <size_t... indices>
823d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nisslerstruct make_index_sequence_builder<0, indices...> {
833d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nissler  using Type = index_sequence<indices...>;
843d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nissler};
853d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nissler
863d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nisslertemplate <size_t size>
873d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nisslerconstexpr typename make_index_sequence_builder<size>::Type
883d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nisslermake_index_sequence(){
893d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nissler  return typename make_index_sequence_builder<size>::Type();
903d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nissler};
913d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nissler
923d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nissler}  // namespace nvram
933d2f13f288feb42f1dfcfe558af27955edefaad3Mattias Nissler
94a715cb1840f9a0c813c90707a351687f7a77950eMattias Nissler#endif  // NVRAM_MESSAGES_TYPE_TRAITS_H_
95