dvander@54: /* vim: set ts=4 sw=4 tw=99 et: dvander@54: * dvander@54: * Copyright (C) 2012 David Anderson dvander@54: * dvander@54: * This file is part of JITCraft. dvander@54: * dvander@54: * JITCraft is free software: you can redistribute it and/or modify it under dvander@54: * the terms of the GNU General Public License as published by the Free dvander@54: * Software Foundation, either version 3 of the License, or (at your option) dvander@54: * any later version. dvander@54: * dvander@54: * Foobar is distributed in the hope that it will be useful, but WITHOUT ANY dvander@54: * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS dvander@54: * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. dvander@54: * dvander@54: * You should have received a copy of the GNU General Public License along with dvander@54: * JITCraft. If not, see http://www.gnu.org/licenses/. dvander@54: */ dvander@54: #ifndef _include_jitcraft_string_h_ dvander@54: #define _include_jitcraft_string_h_ dvander@54: dvander@54: #include "Heap.h" dvander@54: dvander@59: namespace ke { dvander@54: dvander@54: // A fixed-length string containing UTF-8 characters. dvander@54: class String : public Object dvander@54: { dvander@54: uint32 length_; dvander@54: dvander@54: public: dvander@54: static String *New(Zone *zone, const char *from, Heap::Tenure tenure = Heap::Tenure_Default); dvander@54: static String *New(Zone *zone, const char *from, size_t length, Heap::Tenure tenure = Heap::Tenure_Default); dvander@54: dvander@54: unsigned length() { dvander@54: return length_; dvander@54: } dvander@54: char *chars() { dvander@54: return reinterpret_cast(this + 1); dvander@54: } dvander@251: char *chars(Zone *zone) { dvander@251: return chars(); dvander@251: } dvander@161: size_t objSize() { dvander@161: return SizeFor(length()); dvander@161: } dvander@54: dvander@54: static size_t SizeFor(unsigned length) { dvander@161: return sizeof(String) + sizeof(char) * (length + 1); dvander@54: } dvander@54: dvander@54: static inline String *cast(Object *obj) { dvander@54: assert(!obj || obj->is(MapKind_String)); dvander@54: return reinterpret_cast(obj); dvander@54: } dvander@54: }; dvander@54: dvander@195: class CharsAndLength dvander@195: { dvander@195: const char *str_; dvander@195: size_t length_; dvander@195: dvander@195: public: dvander@195: CharsAndLength(const char *str, size_t length) dvander@195: : str_(str), dvander@195: length_(length) dvander@195: { dvander@195: } dvander@195: dvander@195: const char *str() const { dvander@195: return str_; dvander@195: } dvander@195: size_t length() const { dvander@195: return length_; dvander@195: } dvander@195: }; dvander@195: dvander@54: } dvander@54: dvander@54: #endif // _include_jitcraft_string_h_