// Copyright (c) 2023 PaddlePaddle 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. #pragma once #include #include #include #include #include namespace ir { /// /// \brief Equivalent to boost::hash_combine. /// std::size_t hash_combine(std::size_t lhs, std::size_t rhs); /// /// \brief Aligned malloc and free functions. /// void *aligned_malloc(size_t size, size_t alignment); void aligned_free(void *mem_ptr); /// /// \brief Some template methods for manipulating std::tuple. /// /// (1) Pop front element from Tuple template struct PopFrontT; template struct PopFrontT> { public: using Type = std::tuple; }; template using PopFront = typename PopFrontT::Type; /// (2) Push front element to Tuple template struct PushFrontT; template struct PushFrontT> { public: using Type = std::tuple; }; template struct PushFrontT, std::tuple> { public: using Type = std::tuple; }; template using PushFront = typename PushFrontT::Type; /// (3) IsEmpty template struct IsEmpty { static constexpr bool value = false; }; template <> struct IsEmpty> { static constexpr bool value = true; }; /// (4) IfThenElseT template struct IfThenElseT { using Type = TrueT; }; template struct IfThenElseT { using Type = FalseT; }; template using IfThenElse = typename IfThenElseT::Type; /// (5) Filter out all types inherited from BaseT from the tuple. template