103f75e22ad9ea75dc536d199c3d11a98884be314Shih-wei Liao/* 203f75e22ad9ea75dc536d199c3d11a98884be314Shih-wei Liao * Copyright 2011, The Android Open Source Project 303f75e22ad9ea75dc536d199c3d11a98884be314Shih-wei Liao * 403f75e22ad9ea75dc536d199c3d11a98884be314Shih-wei Liao * Licensed under the Apache License, Version 2.0 (the "License"); 503f75e22ad9ea75dc536d199c3d11a98884be314Shih-wei Liao * you may not use this file except in compliance with the License. 603f75e22ad9ea75dc536d199c3d11a98884be314Shih-wei Liao * You may obtain a copy of the License at 703f75e22ad9ea75dc536d199c3d11a98884be314Shih-wei Liao * 803f75e22ad9ea75dc536d199c3d11a98884be314Shih-wei Liao * http://www.apache.org/licenses/LICENSE-2.0 903f75e22ad9ea75dc536d199c3d11a98884be314Shih-wei Liao * 1003f75e22ad9ea75dc536d199c3d11a98884be314Shih-wei Liao * Unless required by applicable law or agreed to in writing, software 1103f75e22ad9ea75dc536d199c3d11a98884be314Shih-wei Liao * distributed under the License is distributed on an "AS IS" BASIS, 1203f75e22ad9ea75dc536d199c3d11a98884be314Shih-wei Liao * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1303f75e22ad9ea75dc536d199c3d11a98884be314Shih-wei Liao * See the License for the specific language governing permissions and 1403f75e22ad9ea75dc536d199c3d11a98884be314Shih-wei Liao * limitations under the License. 1503f75e22ad9ea75dc536d199c3d11a98884be314Shih-wei Liao */ 1603f75e22ad9ea75dc536d199c3d11a98884be314Shih-wei Liao 17c85473833f3b6f0dc951698e2481e3d3d98942eeLogan Chien#ifndef TRAITS_H 18c85473833f3b6f0dc951698e2481e3d3d98942eeLogan Chien#define TRAITS_H 19c85473833f3b6f0dc951698e2481e3d3d98942eeLogan Chien 20c85473833f3b6f0dc951698e2481e3d3d98942eeLogan Chien#include <stddef.h> 21c85473833f3b6f0dc951698e2481e3d3d98942eeLogan Chien 22c85473833f3b6f0dc951698e2481e3d3d98942eeLogan Chientemplate <typename Type> 23c85473833f3b6f0dc951698e2481e3d3d98942eeLogan Chienstruct TypeTraits { 24c85473833f3b6f0dc951698e2481e3d3d98942eeLogan Chienprivate: 25c85473833f3b6f0dc951698e2481e3d3d98942eeLogan Chien struct AlignmentTest { 26c85473833f3b6f0dc951698e2481e3d3d98942eeLogan Chien char pending; 27c85473833f3b6f0dc951698e2481e3d3d98942eeLogan Chien Type element; 28c85473833f3b6f0dc951698e2481e3d3d98942eeLogan Chien }; 29c85473833f3b6f0dc951698e2481e3d3d98942eeLogan Chien 30c85473833f3b6f0dc951698e2481e3d3d98942eeLogan Chienpublic: 31c85473833f3b6f0dc951698e2481e3d3d98942eeLogan Chien enum { size = sizeof(Type) }; 32c85473833f3b6f0dc951698e2481e3d3d98942eeLogan Chien enum { align = offsetof(AlignmentTest, element) }; 33c85473833f3b6f0dc951698e2481e3d3d98942eeLogan Chien}; 34c85473833f3b6f0dc951698e2481e3d3d98942eeLogan Chien 350591fcb6a3b4b1154501cf950665aeee863dcedcLogan Chien#define TYPE_TRAITS_SPECIALIZE(TYPE, SIZE, ALIGN) \ 360591fcb6a3b4b1154501cf950665aeee863dcedcLogan Chientemplate <> \ 370591fcb6a3b4b1154501cf950665aeee863dcedcLogan Chienstruct TypeTraits<TYPE> { \ 380591fcb6a3b4b1154501cf950665aeee863dcedcLogan Chien enum { size = SIZE }; \ 390591fcb6a3b4b1154501cf950665aeee863dcedcLogan Chien enum { align = ALIGN }; \ 400591fcb6a3b4b1154501cf950665aeee863dcedcLogan Chien}; 410591fcb6a3b4b1154501cf950665aeee863dcedcLogan Chien 42c85473833f3b6f0dc951698e2481e3d3d98942eeLogan Chien#endif // TRAITS_H 43