hb-private.hh revision 35a7383c6138fd705560f0d4bb30659cbd1ab64c
164aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod/*
26c78683c042250a7b5a6fc6ebae4717b03fadf9eBehdad Esfahbod * Copyright (C) 2007,2008,2009  Red Hat, Inc.
364aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod *
464aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod *  This is part of HarfBuzz, an OpenType Layout engine library.
564aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod *
664aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod * Permission is hereby granted, without written agreement and without
764aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod * license or royalty fees, to use, copy, modify, and distribute this
864aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod * software and its documentation for any purpose, provided that the
964aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod * above copyright notice and the following two paragraphs appear in
1064aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod * all copies of this software.
1164aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod *
1264aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
1364aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
1464aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
1564aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
1664aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod * DAMAGE.
1764aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod *
1864aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
1964aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
2064aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
2164aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
2264aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
2364aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod *
2464aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod * Red Hat Author(s): Behdad Esfahbod
2564aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod */
2664aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod
278dd1c8b8d6797d899d0f5b0a8015886bf6520ca2Behdad Esfahbod#ifndef HB_PRIVATE_H
288dd1c8b8d6797d899d0f5b0a8015886bf6520ca2Behdad Esfahbod#define HB_PRIVATE_H
295b3f7702a64fe0513d08a67bdb72704e46fd7cd4Behdad Esfahbod
30f9cd1014f8f4d0394b5e0e9eefc1e2af13c59cabBehdad Esfahbod#include "hb-common.h"
31c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod
3212360f7c159826ae72271b34486dee59d96aa8caBehdad Esfahbod#include <glib.h>
3312360f7c159826ae72271b34486dee59d96aa8caBehdad Esfahbod
3412360f7c159826ae72271b34486dee59d96aa8caBehdad Esfahbod/* Macros to convert to/from BigEndian */
3512360f7c159826ae72271b34486dee59d96aa8caBehdad Esfahbod#define hb_be_uint8_t
3612360f7c159826ae72271b34486dee59d96aa8caBehdad Esfahbod#define hb_be_int8_t
3712360f7c159826ae72271b34486dee59d96aa8caBehdad Esfahbod#define hb_be_uint16_t	GUINT16_TO_BE
3812360f7c159826ae72271b34486dee59d96aa8caBehdad Esfahbod#define hb_be_int16_t	GINT16_TO_BE
3912360f7c159826ae72271b34486dee59d96aa8caBehdad Esfahbod#define hb_be_uint32_t	GUINT32_TO_BE
4012360f7c159826ae72271b34486dee59d96aa8caBehdad Esfahbod#define hb_be_int32_t	GINT32_TO_BE
4112360f7c159826ae72271b34486dee59d96aa8caBehdad Esfahbod#define hb_be_uint64_t	GUINT64_TO_BE
4212360f7c159826ae72271b34486dee59d96aa8caBehdad Esfahbod#define hb_be_int64_t	GINT64_TO_BE
4312360f7c159826ae72271b34486dee59d96aa8caBehdad Esfahbod
44c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod#define HB_LIKELY	G_LIKELY
4512360f7c159826ae72271b34486dee59d96aa8caBehdad Esfahbod#define HB_UNLIKELY	G_UNLIKELY
467586089c6fa8185cad8387869d3703c637e5cbb1Behdad Esfahbod#define HB_UNUSED(arg) ((arg) = (arg))
47c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod#define HB_GNUC_UNUSED	G_GNUC_UNUSED
48c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod
49c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod
50c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod#include <stdlib.h>
51c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod#include <stdio.h> /* XXX */
52f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod#include <string.h>
53f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod#include <assert.h>
54c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod
55c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod/* Basics */
56c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod
57c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod#undef MIN
58c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod#define MIN(a,b) ((a) < (b) ? (a) : (b))
597586089c6fa8185cad8387869d3703c637e5cbb1Behdad Esfahbod
60c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod#ifndef HB_INTERNAL
61c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod# define HB_INTERNAL
62c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod#endif
63c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod
64c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod#ifndef NULL
65c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod# define NULL ((void *)0)
66c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod#endif
67c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod
68c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod#ifndef FALSE
69c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod# define FALSE 0
70c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod#endif
71c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod
72c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod#ifndef TRUE
73c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod# define TRUE 1
74c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod#endif
7512360f7c159826ae72271b34486dee59d96aa8caBehdad Esfahbod
7635a7383c6138fd705560f0d4bb30659cbd1ab64cBehdad Esfahbod#define HB_STMT_START do
7735a7383c6138fd705560f0d4bb30659cbd1ab64cBehdad Esfahbod#define HB_STMT_END   while (0)
785b3f7702a64fe0513d08a67bdb72704e46fd7cd4Behdad Esfahbod
79303fe62824d4e99df554b6bfaacba05d068522fbBehdad Esfahbod#define _ASSERT_STATIC1(_line, _cond) typedef int _static_assert_on_line_##_line##_failed[(_cond)?1:-1]
80303fe62824d4e99df554b6bfaacba05d068522fbBehdad Esfahbod#define _ASSERT_STATIC0(_line, _cond) _ASSERT_STATIC1 (_line, (_cond))
81303fe62824d4e99df554b6bfaacba05d068522fbBehdad Esfahbod#define ASSERT_STATIC(_cond) _ASSERT_STATIC0 (__LINE__, (_cond))
82303fe62824d4e99df554b6bfaacba05d068522fbBehdad Esfahbod
83303fe62824d4e99df554b6bfaacba05d068522fbBehdad Esfahbod#define ASSERT_SIZE(_type, _size) ASSERT_STATIC (sizeof (_type) == (_size))
84303fe62824d4e99df554b6bfaacba05d068522fbBehdad Esfahbod
85c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod
86c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod/* Return the number of 1 bits in mask.
87c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod *
88c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod * GCC 3.4 supports a "population count" builtin, which on many targets is
89c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod * implemented with a single instruction. There is a fallback definition
90c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod * in libgcc in case a target does not have one, which should be just as
91c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod * good as the open-coded solution below, (which is "HACKMEM 169").
92c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod */
93c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbodstatic inline unsigned int
94c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod_hb_popcount32 (uint32_t mask)
95c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod{
96c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
97c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod    return __builtin_popcount (mask);
98c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod#else
99c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod    register int y;
100c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod
101c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod    y = (mask >> 1) &033333333333;
102c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod    y = mask - y - ((y >>1) & 033333333333);
103c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod    return (((y + (y >> 3)) & 030707070707) % 077);
104c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod#endif
105c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod}
106c7d457aa3ae7138630f52ca7263f663a3ea284c0Behdad Esfahbod
1078dd1c8b8d6797d899d0f5b0a8015886bf6520ca2Behdad Esfahbod#endif /* HB_PRIVATE_H */
108