17ff3ee19f4b831a526baf4b928d1ac172d070d82Adam Lesinski/*
27ff3ee19f4b831a526baf4b928d1ac172d070d82Adam Lesinski * Copyright (C) 2015 The Android Open Source Project
37ff3ee19f4b831a526baf4b928d1ac172d070d82Adam Lesinski *
47ff3ee19f4b831a526baf4b928d1ac172d070d82Adam Lesinski * Licensed under the Apache License, Version 2.0 (the "License");
57ff3ee19f4b831a526baf4b928d1ac172d070d82Adam Lesinski * you may not use this file except in compliance with the License.
67ff3ee19f4b831a526baf4b928d1ac172d070d82Adam Lesinski * You may obtain a copy of the License at
77ff3ee19f4b831a526baf4b928d1ac172d070d82Adam Lesinski *
87ff3ee19f4b831a526baf4b928d1ac172d070d82Adam Lesinski *      http://www.apache.org/licenses/LICENSE-2.0
97ff3ee19f4b831a526baf4b928d1ac172d070d82Adam Lesinski *
107ff3ee19f4b831a526baf4b928d1ac172d070d82Adam Lesinski * Unless required by applicable law or agreed to in writing, software
117ff3ee19f4b831a526baf4b928d1ac172d070d82Adam Lesinski * distributed under the License is distributed on an "AS IS" BASIS,
127ff3ee19f4b831a526baf4b928d1ac172d070d82Adam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137ff3ee19f4b831a526baf4b928d1ac172d070d82Adam Lesinski * See the License for the specific language governing permissions and
147ff3ee19f4b831a526baf4b928d1ac172d070d82Adam Lesinski * limitations under the License.
157ff3ee19f4b831a526baf4b928d1ac172d070d82Adam Lesinski */
167ff3ee19f4b831a526baf4b928d1ac172d070d82Adam Lesinski
177ff3ee19f4b831a526baf4b928d1ac172d070d82Adam Lesinski#ifndef AAPT_UTIL_TYPETRAITS_H
187ff3ee19f4b831a526baf4b928d1ac172d070d82Adam Lesinski#define AAPT_UTIL_TYPETRAITS_H
197ff3ee19f4b831a526baf4b928d1ac172d070d82Adam Lesinski
207ff3ee19f4b831a526baf4b928d1ac172d070d82Adam Lesinski#include <type_traits>
217ff3ee19f4b831a526baf4b928d1ac172d070d82Adam Lesinski
227ff3ee19f4b831a526baf4b928d1ac172d070d82Adam Lesinskinamespace aapt {
237ff3ee19f4b831a526baf4b928d1ac172d070d82Adam Lesinski
247ff3ee19f4b831a526baf4b928d1ac172d070d82Adam Lesinski#define DEFINE_HAS_BINARY_OP_TRAIT(name, op) \
257ff3ee19f4b831a526baf4b928d1ac172d070d82Adam Lesinski    template <typename T, typename U> \
267ff3ee19f4b831a526baf4b928d1ac172d070d82Adam Lesinski    struct name { \
277ff3ee19f4b831a526baf4b928d1ac172d070d82Adam Lesinski        template <typename V, typename W> \
287ff3ee19f4b831a526baf4b928d1ac172d070d82Adam Lesinski        static constexpr decltype(std::declval<V>() op std::declval<W>(), bool()) test(int) { \
297ff3ee19f4b831a526baf4b928d1ac172d070d82Adam Lesinski        return true; \
307ff3ee19f4b831a526baf4b928d1ac172d070d82Adam Lesinski    } \
317ff3ee19f4b831a526baf4b928d1ac172d070d82Adam Lesinski    template <typename V, typename W> \
327ff3ee19f4b831a526baf4b928d1ac172d070d82Adam Lesinski    static constexpr bool test(...) { \
337ff3ee19f4b831a526baf4b928d1ac172d070d82Adam Lesinski        return false; \
347ff3ee19f4b831a526baf4b928d1ac172d070d82Adam Lesinski    } \
357ff3ee19f4b831a526baf4b928d1ac172d070d82Adam Lesinski    static constexpr bool value = test<T, U>(int()); \
367ff3ee19f4b831a526baf4b928d1ac172d070d82Adam Lesinski}
377ff3ee19f4b831a526baf4b928d1ac172d070d82Adam Lesinski
387ff3ee19f4b831a526baf4b928d1ac172d070d82Adam LesinskiDEFINE_HAS_BINARY_OP_TRAIT(has_eq_op, ==);
397ff3ee19f4b831a526baf4b928d1ac172d070d82Adam LesinskiDEFINE_HAS_BINARY_OP_TRAIT(has_lt_op, <);
407ff3ee19f4b831a526baf4b928d1ac172d070d82Adam Lesinski
417ff3ee19f4b831a526baf4b928d1ac172d070d82Adam Lesinski/**
427ff3ee19f4b831a526baf4b928d1ac172d070d82Adam Lesinski * Type trait that checks if two types can be equated (==) and compared (<).
437ff3ee19f4b831a526baf4b928d1ac172d070d82Adam Lesinski */
447ff3ee19f4b831a526baf4b928d1ac172d070d82Adam Lesinskitemplate <typename T, typename U>
457ff3ee19f4b831a526baf4b928d1ac172d070d82Adam Lesinskistruct is_comparable {
467ff3ee19f4b831a526baf4b928d1ac172d070d82Adam Lesinski    static constexpr bool value = has_eq_op<T, U>::value && has_lt_op<T, U>::value;
477ff3ee19f4b831a526baf4b928d1ac172d070d82Adam Lesinski};
487ff3ee19f4b831a526baf4b928d1ac172d070d82Adam Lesinski
497ff3ee19f4b831a526baf4b928d1ac172d070d82Adam Lesinski} // namespace aapt
507ff3ee19f4b831a526baf4b928d1ac172d070d82Adam Lesinski
517ff3ee19f4b831a526baf4b928d1ac172d070d82Adam Lesinski#endif /* AAPT_UTIL_TYPETRAITS_H */
52