src/Strings.h
author David Anderson <dvander@alliedmods.net>
Mon Dec 24 02:56:02 2012 -0800 (2012-12-24)
changeset 235 43287eef2fff
parent 195 c1ba166f3fc4
child 251 ca99a81745fe
permissions -rw-r--r--
Move PrimitiveType_String to a dedicated string type.
dvander@54
     1
/* vim: set ts=4 sw=4 tw=99 et:
dvander@54
     2
 *
dvander@54
     3
 * Copyright (C) 2012 David Anderson
dvander@54
     4
 *
dvander@54
     5
 * This file is part of JITCraft.
dvander@54
     6
 *
dvander@54
     7
 * JITCraft is free software: you can redistribute it and/or modify it under
dvander@54
     8
 * the terms of the GNU General Public License as published by the Free
dvander@54
     9
 * Software Foundation, either version 3 of the License, or (at your option)
dvander@54
    10
 * any later version.
dvander@54
    11
 * 
dvander@54
    12
 * Foobar is distributed in the hope that it will be useful, but WITHOUT ANY
dvander@54
    13
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
dvander@54
    14
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
dvander@54
    15
 *
dvander@54
    16
 * You should have received a copy of the GNU General Public License along with
dvander@54
    17
 * JITCraft. If not, see http://www.gnu.org/licenses/.
dvander@54
    18
 */
dvander@54
    19
#ifndef _include_jitcraft_string_h_
dvander@54
    20
#define _include_jitcraft_string_h_
dvander@54
    21
dvander@54
    22
#include "Heap.h"
dvander@54
    23
dvander@59
    24
namespace ke {
dvander@54
    25
dvander@54
    26
// A fixed-length string containing UTF-8 characters.
dvander@54
    27
class String : public Object
dvander@54
    28
{
dvander@54
    29
    uint32 length_;
dvander@54
    30
    
dvander@54
    31
  public:
dvander@54
    32
    static String *New(Zone *zone, const char *from, Heap::Tenure tenure = Heap::Tenure_Default);
dvander@54
    33
    static String *New(Zone *zone, const char *from, size_t length, Heap::Tenure tenure = Heap::Tenure_Default);
dvander@54
    34
dvander@54
    35
    unsigned length() {
dvander@54
    36
        return length_;
dvander@54
    37
    }
dvander@54
    38
    char *chars() {
dvander@54
    39
        return reinterpret_cast<char *>(this + 1);
dvander@54
    40
    }
dvander@161
    41
    size_t objSize() {
dvander@161
    42
        return SizeFor(length());
dvander@161
    43
    }
dvander@54
    44
dvander@54
    45
    static size_t SizeFor(unsigned length) {
dvander@161
    46
        return sizeof(String) + sizeof(char) * (length + 1);
dvander@54
    47
    }
dvander@54
    48
dvander@54
    49
    static inline String *cast(Object *obj) {
dvander@54
    50
        assert(!obj || obj->is(MapKind_String));
dvander@54
    51
        return reinterpret_cast<String *>(obj);
dvander@54
    52
    }
dvander@54
    53
};
dvander@54
    54
dvander@195
    55
class CharsAndLength
dvander@195
    56
{
dvander@195
    57
    const char *str_;
dvander@195
    58
    size_t length_;
dvander@195
    59
dvander@195
    60
  public:
dvander@195
    61
    CharsAndLength(const char *str, size_t length)
dvander@195
    62
        : str_(str),
dvander@195
    63
        length_(length)
dvander@195
    64
    {
dvander@195
    65
    }
dvander@195
    66
dvander@195
    67
    const char *str() const {
dvander@195
    68
        return str_;
dvander@195
    69
    }
dvander@195
    70
    size_t length() const {
dvander@195
    71
        return length_;
dvander@195
    72
    }
dvander@195
    73
};
dvander@195
    74
dvander@54
    75
}
dvander@54
    76
dvander@54
    77
#endif // _include_jitcraft_string_h_