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