jitcraft/Utility.h
author David Anderson <dvander@alliedmods.net>
Mon Jul 02 01:24:57 2012 -0700 (2012-07-02)
changeset 25 23e8b3d8e4e6
parent 11 a350c2cc736a
child 28 a9665857cfd5
permissions -rw-r--r--
Scanning, parsing, and static analysis now report errors properly.
dvander@0
     1
/*
dvander@0
     2
 * Copyright (C) 2012 David Anderson
dvander@0
     3
 *
dvander@0
     4
 * This file is part of JITCraft.
dvander@0
     5
 *
dvander@0
     6
 * JITCraft is free software: you can redistribute it and/or modify it under
dvander@0
     7
 * the terms of the GNU General Public License as published by the Free
dvander@0
     8
 * Software Foundation, either version 3 of the License, or (at your option)
dvander@0
     9
 * any later version.
dvander@0
    10
 * 
dvander@0
    11
 * Foobar is distributed in the hope that it will be useful, but WITHOUT ANY
dvander@0
    12
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
dvander@0
    13
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
dvander@0
    14
 *
dvander@0
    15
 * You should have received a copy of the GNU General Public License along with
dvander@0
    16
 * JITCraft. If not, see http://www.gnu.org/licenses/.
dvander@0
    17
 */
dvander@0
    18
#ifndef _include_jitcraft_utility_h_
dvander@0
    19
#define _include_jitcraft_utility_h_
dvander@0
    20
dvander@0
    21
#include <assert.h>
dvander@0
    22
#include <intrin.h>
dvander@11
    23
#include <stdint.h>
dvander@11
    24
dvander@11
    25
#ifdef _MSC_VER
dvander@11
    26
# pragma warning(disable:4355)
dvander@11
    27
#endif
dvander@0
    28
dvander@0
    29
namespace jc {
dvander@0
    30
dvander@0
    31
static const size_t kMallocAlignment = sizeof(void *) * 2;
dvander@0
    32
dvander@11
    33
typedef uint8_t uint8;
dvander@11
    34
typedef int32_t int32;
dvander@11
    35
typedef uint32_t uint32;
dvander@11
    36
dvander@11
    37
typedef uint8 * Address;
dvander@11
    38
dvander@11
    39
static const size_t kKB = 1024;
dvander@11
    40
static const size_t kMB = 1024 * kKB;
dvander@11
    41
static const size_t kGB = 1024 * kMB;
dvander@11
    42
dvander@0
    43
template <typename T>
dvander@0
    44
class AutoVec
dvander@0
    45
{
dvander@0
    46
    T *t_;
dvander@0
    47
dvander@0
    48
  public:
dvander@0
    49
    AutoVec()
dvander@0
    50
      : t_(NULL)
dvander@0
    51
    {
dvander@0
    52
    }
dvander@0
    53
    AutoVec(T *t)
dvander@0
    54
      : t_(t)
dvander@0
    55
    {
dvander@0
    56
    }
dvander@0
    57
    ~AutoVec() {
dvander@0
    58
        delete [] t_;
dvander@0
    59
    }
dvander@0
    60
    operator T *() {
dvander@0
    61
        return t_;
dvander@0
    62
    }
dvander@0
    63
    void operator =(T *t) {
dvander@0
    64
        if (t_)
dvander@0
    65
            delete [] t_;
dvander@0
    66
        t_ = t;
dvander@0
    67
    }
dvander@0
    68
};
dvander@0
    69
dvander@0
    70
static inline size_t
dvander@0
    71
Log2(size_t number)
dvander@0
    72
{
dvander@0
    73
    assert(number != 0);
dvander@0
    74
dvander@0
    75
    unsigned long rval;
dvander@0
    76
    _BitScanReverse(&rval, number);
dvander@0
    77
    return rval;
dvander@0
    78
}
dvander@0
    79
dvander@0
    80
static inline bool
dvander@0
    81
IsPowerOfTwo(size_t value)
dvander@0
    82
{
dvander@0
    83
    if (value == 0)
dvander@0
    84
        return false;
dvander@0
    85
    return !(value & (value - 1));
dvander@0
    86
}
dvander@0
    87
dvander@0
    88
static inline size_t
dvander@0
    89
Align(size_t count, size_t alignment)
dvander@0
    90
{
dvander@0
    91
    assert(IsPowerOfTwo(alignment));
dvander@0
    92
    return count + (alignment - (count % alignment)) % alignment;
dvander@0
    93
}
dvander@0
    94
dvander@0
    95
static inline bool
dvander@0
    96
IsUint32AddSafe(unsigned a, unsigned b)
dvander@0
    97
{
dvander@0
    98
    unsigned log2_a = Log2(a);
dvander@0
    99
    unsigned log2_b = Log2(b);
dvander@0
   100
    return (log2_a < sizeof(unsigned) * 8) &&
dvander@0
   101
           (log2_b < sizeof(unsigned) * 8);
dvander@0
   102
}
dvander@0
   103
dvander@0
   104
static inline bool
dvander@0
   105
IsUint32MultiplySafe(unsigned a, unsigned b)
dvander@0
   106
{
dvander@0
   107
    if (a <= 1 || b <= 1)
dvander@0
   108
        return true;
dvander@0
   109
dvander@0
   110
    unsigned log2_a = Log2(a);
dvander@0
   111
    unsigned log2_b = Log2(b);
dvander@0
   112
    return log2_a + log2_b <= sizeof(unsigned) * 8;
dvander@0
   113
}
dvander@0
   114
dvander@0
   115
#define ARRAY_LENGTH(array) (sizeof(array) / sizeof(array[0]))
dvander@0
   116
#define STATIC_ASSERT(cond) extern int static_assert_f(int a[(cond) ? 1 : -1])
dvander@0
   117
dvander@11
   118
template <typename T>
dvander@11
   119
static inline bool
dvander@11
   120
IsAligned(T addr, size_t alignment)
dvander@11
   121
{
dvander@11
   122
    assert(IsPowerOfTwo(alignment));
dvander@11
   123
    return !(uintptr_t(addr) & (alignment - 1));
dvander@11
   124
}
dvander@11
   125
dvander@11
   126
static inline Address
dvander@11
   127
AlignedBase(Address addr, size_t alignment)
dvander@11
   128
{
dvander@11
   129
    assert(IsPowerOfTwo(alignment));
dvander@11
   130
    return Address(uintptr_t(addr) & ~(alignment - 1));
dvander@11
   131
}
dvander@11
   132
dvander@0
   133
}
dvander@0
   134
dvander@0
   135
#endif // _include_jitcraft_utility_h_