/*
* Copyright 2004-2011 H2 Group. Multiple-Licensed under the H2 License,
* Version 1.0, and under the Eclipse Public License, Version 1.0
* (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package org.h2.java.lang;
import org.h2.java.Ignore;
import org.h2.java.Local;
/* c:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <wchar.h>
#include <stdint.h>
#define __STDC_FORMAT_MACROS
#include <inttypes.h>
#define jvoid void
#define jboolean int8_t
#define jbyte int8_t
#define jchar wchar_t
#define jint int32_t
#define jlong int64_t
#define jfloat float
#define jdouble double
#define ujint uint32_t
#define ujlong uint64_t
#define true 1
#define false 0
#define null 0
#define STRING_REF(s) ptr<java_lang_String> \
(new java_lang_String(ptr< array<jchar> > \
(new array<jchar>(s, (jint) wcslen(s)))));
#define STRING_PTR(s) new java_lang_String \
(new array<jchar>(s, (jint) wcslen(s)));
class RefBase {
protected:
jint refCount;
public:
RefBase() {
refCount = 0;
}
void reference() {
refCount++;
}
void release() {
if (--refCount == 0) {
delete this;
}
}
virtual ~RefBase() {
}
};
template <class T> class ptr {
T* pointer;
public:
explicit ptr(T* p=0) : pointer(p) {
if (p != 0) {
((RefBase*)p)->reference();
}
}
ptr(const ptr<T>& p) : pointer(p.pointer) {
if (p.pointer != 0) {
((RefBase*)p.pointer)->reference();
}
}
~ptr() {
if (pointer != 0) {
((RefBase*)pointer)->release();
}
}
ptr<T>& operator= (const ptr<T>& p) {
if (this != &p && pointer != p.pointer) {
if (pointer != 0) {
((RefBase*)pointer)->release();
}
pointer = p.pointer;
if (pointer != 0) {
((RefBase*)pointer)->reference();
}
}
return *this;
}
T& operator*() {
return *pointer;
}
T* getPointer() {
return pointer;
}
T* operator->() {
return pointer;
}
jboolean operator==(const ptr<T>& p) {
return pointer == p->pointer;
}
jboolean operator==(const RefBase* t) {
return pointer == t;
}
};
template <class T> class array : RefBase {
jint len;
T* data;
public:
array(const T* d, jint len) {
this->len = len;
data = new T[len];
memcpy(data, d, sizeof(T) * len);
}
array(jint len) {
this->len = len;
data = new T[len];
}
~array() {
delete[] data;
}
T* getPointer() {
return data;
}
jint length() {
return len;
}
T& operator[](jint index) {
if (index < 0 || index >= len) {
throw "index set";
}
return data[index];
}
T& at(jint index) {
if (index < 0 || index >= len) {
throw "index set";
}
return data[index];
}
};
*/
/**
* A java.lang.String implementation.
*/
public class String {
/**
* The character array.
*/
@Local
char[] chars;
private int hash;
public String(char[] chars) {
this.chars = new char[chars.length];
System.arraycopy(chars, 0, this.chars, 0, chars.length);
}
public String(char[] chars, int offset, int count) {
this.chars = new char[count];
System.arraycopy(chars, offset, this.chars, 0, count);
}
public int hashCode() {
int h = hash;
if (h == 0) {
int size = chars.length;
if (size != 0) {
for (int i = 0; i < size; i++) {
h = h * 31 + chars[i];
}
hash = h;
}
}
return h;
}
/**
* Get the length of the string.
*
* @return the length
*/
public int length() {
return chars.length;
}
/**
* The toString method.
*
* @return the string
*/
public String toStringMethod() {
return this;
}
/**
* Get the java.lang.String.
*
* @return the string
*/
@Ignore
public java.lang.String asString() {
return new java.lang.String(chars);
}
/**
* Wrap a java.lang.String.
*
* @param x the string
* @return the object
*/
@Ignore
public static String wrap(java.lang.String x) {
return new String(x.toCharArray());
}
}