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