obj2ptr
来自「R 树」· 代码 · 共 1,106 行 · 第 1/2 页
TXT
1,106 行
## generate constructor stub#sub generateConstructorStub { print HANDLE "$ptrClass\n"; print HANDLE "new_$ptrClass("; for($i=0; $i<@params; $i++) { print HANDLE ", " if ($i != 0); # remove default argument ($param = $params[$i]) =~ s/\s*=.*$//; print HANDLE $param; } print HANDLE ")\n"; print HANDLE "{\n"; print HANDLE " $objClass *_obj;\n"; print HANDLE " $ptrClass _ptr;\n"; print HANDLE "\n"; print HANDLE " _obj = new $objClass("; for($i=0; $i<@variables; $i++) { print HANDLE ", " if ($i != 0); print HANDLE $variables[$i]; } print HANDLE ");\n"; print HANDLE "\n"; print HANDLE " if(_obj->hasFailed())\n"; print HANDLE " return $ptrClass::null;\n"; print HANDLE "\n"; print HANDLE " _ptr.assign(_obj);\n"; print HANDLE " return _ptr;\n"; print HANDLE "}\n"; print HANDLE "\n";}## generate equals stub#sub generateEqualsStub { if($returnType ne "HnBool") { die("$program: the return type of equals() must be HnBool, stopped"); } if(@params != 1 || !($params[0] =~ /const $ptrClass &$variables[0]/)) { die("$program: the parameter type of equals() must be ". "`const $ptrClass &', stopped"); } print HANDLE <<"EOF";HnBool$ptrClass::equals(const $ptrClass &ptr) const { if(isInvalid()) { if(ptr.isInvalid()) return HnTRUE; else return HnFALSE; } else { if(ptr.isInvalid()) return HnFALSE; else return getObject()->equals(ptr); }}EOF}## generate toString stub#sub generateToStringStub { if($returnType ne "HnString") { die("$program: the return type of toString() must be HnString, ". "stopped"); } if(@params != 1 || !($params[0] eq "void")) { die("$program: the paramter of toString() must be `void', stopped"); } print HANDLE <<"EOF";HnString$ptrClass::toString(void) const { if(isInvalid()) return "$ptrClass::null"; else return getObject()->toString();}EOF ;}## generate normal stub#sub generateNormalStub { print HANDLE "$returnType\n"; print HANDLE "$ptrClass::$methodName("; for($i=0; $i<@params; $i++) { print HANDLE ", " if ($i != 0); # remove default argument ($param = $params[$i]) =~ s/\s*=.*$//; print HANDLE $param; } print HANDLE ")"; print HANDLE " $qualifier" if ($qualifier); print HANDLE "\n"; print HANDLE "{\n"; if($returnType eq "void") { print HANDLE " "; } else { print HANDLE " return "; } print HANDLE "getObject()->$methodName("; for($i=0; $i<@variables; $i++) { print HANDLE ", " if ($i != 0); print HANDLE $variables[$i]; } print HANDLE ");\n"; print HANDLE "}\n"; print HANDLE "\n";}## generate operator stub#sub generateOperatorStub { if("$returnType" ne "") { print HANDLE "$returnType\n"; } print HANDLE "$ptrClass::$methodName("; for($i=0; $i<@params; $i++) { print HANDLE ", " if ($i != 0); print HANDLE $params[$i]; } print HANDLE ")"; print HANDLE " $qualifier" if ($qualifier); print HANDLE "\n"; print HANDLE "{\n"; if($returnType eq "void") { print HANDLE " "; } else { print HANDLE " return "; } print HANDLE "getObject()->$methodName("; for($i=0; $i<@variables; $i++) { print HANDLE ", " if ($i != 0); print HANDLE $variables[$i]; } print HANDLE ");\n"; print HANDLE "}\n"; print HANDLE "\n";}## generate class method stub#sub generateClassMethodStub { print HANDLE "$returnType\n"; print HANDLE "$ptrClass::$methodName("; for($i=0; $i<@params; $i++) { print HANDLE ", " if ($i != 0); print HANDLE $params[$i]; } print HANDLE ")"; print HANDLE " $qualifier" if ($qualifier); print HANDLE "\n"; print HANDLE "{\n"; if($returnType eq "void") { print HANDLE " "; } else { print HANDLE " return "; } print HANDLE "$objClass::$methodName("; for($i=0; $i<@variables; $i++) { print HANDLE ", " if ($i != 0); print HANDLE $variables[$i]; } print HANDLE ");\n"; print HANDLE "}\n"; print HANDLE "\n";}## generate array#sub generateArray { print HANDLE <<"EOF";/* * ${ptrClass}ArrayObj */#include <stdlib.h>EOF if($ptrClass ne "HnString") { print HANDLE '#include "HnString.hh"', "\n"; } print HANDLE <<"EOF";class ${ptrClass}ArrayObj: public HnObject {private: $ptrClass **array; int len; int size; static const int initialSize; void initialize(void) { array = NULL; len = 0; size = 0; } void dispose(void) { if(array != NULL) { int i; for(i=0; i<len; i++) delete array[i]; free(array); } array = NULL; len = 0; size = 0; } void ensureSize(int requiredSize);public: /* constructor and destructor */ ${ptrClass}ArrayObj(void); ${ptrClass}ArrayObj(const ${ptrClass}Array &ptr); ~${ptrClass}ArrayObj(void); /* clear, append, insert, and remove */ void clear(void); void append(const $ptrClass &ptr); void append(const ${ptrClass}Array &ptr); void insert(const $ptrClass &ptr, int index); $ptrClass remove(int index); void set(const $ptrClass &ptr, int index); void swap(int i, int j); /* length and get */ int length(void) const { return len; } $ptrClass &get(int i) const; /* utilities */ HnBool equals(const ${ptrClass}Array &ptr) const; int indexOf(const $ptrClass &ptr, int fromIndex) const; HnString toString(void) const;};const int ${ptrClass}ArrayObj::initialSize = 4;static void *xrealloc(void *ptr, size_t size){ if(ptr == NULL) { if((ptr = malloc(size)) == NULL) HnSysError("malloc"); } else { if((ptr = realloc(ptr, size)) == NULL) HnSysError("realloc"); } return ptr;}void${ptrClass}ArrayObj::ensureSize(int requiredSize){ int oldSize, newSize; if((oldSize = size) >= requiredSize) return; if((newSize = oldSize) == 0) newSize = initialSize; while(newSize < requiredSize) newSize *= 2; array = ($ptrClass **)xrealloc(array, sizeof($ptrClass *) * newSize); size = newSize;}${ptrClass}ArrayObj::${ptrClass}ArrayObj(void){ initialize();}${ptrClass}ArrayObj::${ptrClass}ArrayObj(const ${ptrClass}Array &ptr){ initialize(); clear(); append(ptr);}${ptrClass}ArrayObj::~${ptrClass}ArrayObj(void){ dispose();}void${ptrClass}ArrayObj::clear(void){ dispose();}void${ptrClass}ArrayObj::append(const $ptrClass &ptr){ ensureSize(len + 1); array[len] = new $ptrClass(ptr); len ++;}void${ptrClass}ArrayObj::append(const ${ptrClass}Array &ptr){ int i; ensureSize(len + ptr.length()); for(i=0; i<ptr.length(); i++) append(ptr[i]);}void${ptrClass}ArrayObj::insert(const $ptrClass &ptr, int index){ if(index < 0 || index > len) HnAbort("${ptrClass}ArrayObj::insert: " "index is out of bounds."); ensureSize(len + 1); memmove(array + index + 1, array + index, sizeof($ptrClass *) * (len - index)); array[index] = new $ptrClass(ptr); len ++;}$ptrClass${ptrClass}ArrayObj::remove(int index){ $ptrClass ptr = get(index); if(index < 0 || index >= len) HnAbort("${ptrClass}ArrayObj::remove: " "index is out of bounds."); delete array[index]; memmove(array + index, array + index + 1, sizeof($ptrClass *) * (len - index - 1)); len --; return ptr;}void${ptrClass}ArrayObj::set(const $ptrClass &ptr, int index){ if(index < 0 || index >= len) HnAbort("${ptrClass}ArrayObj::set: " "index is out of bounds."); delete array[index]; array[index] = new $ptrClass(ptr);}void${ptrClass}ArrayObj::swap(int i, int j){ if(i < 0 || i >= len || j < 0 || j >= len) HnAbort("${ptrClass}ArrayObj::swap: index is out of bounds."); $ptrClass *ptr = array[i]; array[i] = array[j]; array[j] = ptr;}$ptrClass &${ptrClass}ArrayObj::get(int i) const { if(i < 0 || i >= len) HnAbort("${ptrClass}ArrayObj::get: index is out of bounds."); return *array[i];}HnBool${ptrClass}ArrayObj::equals(const ${ptrClass}Array &ptr) const { int i; if(len != ptr.length()) return HnFALSE; for(i=0; i<len; i++) { if(!array[i]->equals(ptr[i])) return HnFALSE; } return HnTRUE;}int${ptrClass}ArrayObj::indexOf(const $ptrClass &ptr, int fromIndex) const{ int i; for(i=fromIndex; i<len; i++) { if(array[i]->equals(ptr)) return i; } return -1;}HnString${ptrClass}ArrayObj::toString(void) const{ HnString string; string = "[ "; for(int i=0; i<len; i++) { if(i != 0) string += ", "; string += array[i]->toString(); } string += " ]"; return string;}/* * ${ptrClass}Array */const ${ptrClass}Array ${ptrClass}Array::null;${ptrClass}Arraynew_${ptrClass}Array(void){ ${ptrClass}Array ptr; ptr.assign(new ${ptrClass}ArrayObj()); return ptr;}${ptrClass}Arraynew_${ptrClass}Array(const ${ptrClass}Array &value){ ${ptrClass}Array ptr; if(value.isInvalid()) ptr.assign(NULL); else ptr.assign(new ${ptrClass}ArrayObj(value)); return ptr;}void${ptrClass}Array::clear(void){ getObject()->clear();}void${ptrClass}Array::append(const $ptrClass &ptr){ getObject()->append(ptr);}void${ptrClass}Array::append(const ${ptrClass}Array &ptr){ getObject()->append(ptr);}void${ptrClass}Array::insert(const $ptrClass &ptr, int index){ getObject()->insert(ptr, index);}$ptrClass${ptrClass}Array::remove(int index){ return getObject()->remove(index);}void${ptrClass}Array::set(const $ptrClass &ptr, int index){ getObject()->set(ptr, index);}void${ptrClass}Array::swap(int i, int j){ getObject()->swap(i, j);}int${ptrClass}Array::length(void) const{ return getObject()->length();}$ptrClass &${ptrClass}Array::get(int i) const{ return getObject()->get(i);}HnBool${ptrClass}Array::equals(const ${ptrClass}Array &ptr) const{ return getObject()->equals(ptr);}int${ptrClass}Array::indexOf(const $ptrClass &ptr, int fromIndex) const{ return getObject()->indexOf(ptr, fromIndex);}HnString${ptrClass}Array::toString(void) const{ return getObject()->toString();}EOF ;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?