주요 자바 API를 C++ 코드로 바꿔보기. ---- == civa.CivaDef == {{{~cpp #ifndef CIVA_CIVADEF_INCLUDED #define CIVA_CIVADEF_INCLUDED #include namespace civa { namespace io { using boost::shared_ptr; class Serializable; typedef shared_ptr Serializable_Handle; }} // namespace civa::io namespace civa { namespace lang { using boost::shared_ptr; template class Array; //#define Array_Handle(ElementType) boost::shared_ptr< civa::lang::Array > //template typedef shared_ptr< Array > Array_Handle; typedef shared_ptr< Array > charArray_Handle; class CharSequence; typedef shared_ptr CharSequence_Handle; class Comparable; typedef shared_ptr Comparable_Handle; class Object; typedef shared_ptr Object_Handle; class String; typedef shared_ptr String_Handle; }} // namespace civa::lang #endif // CIVA_CIVADEF_INCLUDED }}} === 분석 & 잡담 === * 클래스들이 서로 맞물려서 결국 따로 빼게 되었군. * 파라메터라이즈 typedef 은 컴파일이 안되네.. 으으 Array 쓸땐 길게 다 써줘야하나.. * 매크로는 쓰기 싫은데. == civa.io.Serializable == {{{~cpp #ifndef CIVA_IO_SERIALIZABLE_INCLUDED #define CIVA_IO_SERIALIZABLE_INCLUDED #include "../lang/Object.h" namespace civa { namespace io { class Serializable { }; }} // namespace civa::io #endif // CIVA_IO_SERIALIZABLE_INCLUDED }}} === 분석 & 잡담 === * 인스턴스 생성 못하게 막아줘야 하나. == civa.lang.Array == {{{~cpp #ifndef CIVA_LANG_ARRAY_INCLUDED #define CIVA_LANG_ARRAY_INCLUDED #include "Object.h" namespace civa { namespace lang { template class Array : public Object { private: ElementType* values; int length; public: Array(int length) throw() : length(length) { // 바운드 체크. values = new ElementType[length]; } Array(ElementType newValues[]) { // 배열의 크기가 이게 맞나... length = sizeof(newValues) / sizeof(ElementType); values = new ElementType[length]; for (index = 0; index < length; index++) { values[index] = newValuse[index]; } } ElementType operator[] (int index) throw() { // 바운드 체크. return values[index]; } const ElementType operator[] (int index) const throw() { // 바운드 체크. return values[index]; } size_t getLength() { return length; } public: ~Array() { delete[] values; } }; }} // namespace civa::lang #endif // CIVA_LANG_ARRAY_INCLUDED }}} === 분석 & 잡담 === * 바운드 체크해서 익셉션 던지는거 해야하고, * 배열의 크기 알아내는 법 조사. == civa.lang.CharSequence == {{{~cpp #ifndef CIVA_LANG_CHARSEQUENCE_INCLUDED #define CIVA_LANG_CHARSEQUENCET_INCLUDED #include "Object.h" namespace civa { namespace lang { class CharSequence { public: virtual int length() = NULL; virtual char charAt(int index) = NULL; virtual CharSequence_Handle subSequence(int start, int end) = NULL; virtual String_Handle toString() = NULL; }; }} // namespace civa::lang #endif // CIVA_LANG_CHARSEQUENCET_INCLUDED }}} === 분석 & 잡담 === * 추상클래스니 인스턴스는 생성 안되겠군. == civa.lang.Comparable == {{{~cpp #ifndef CIVA_LANG_COMPARABLE_INCLUDED #define CIVA_LANG_COMPARABLE_INCLUDED #include "Object.h" namespace civa { namespace lang { class Comparable { public: virtual int compareTo(Object o) = NULL; }; }} // namespace civa::lang #endif // CIVA_LANG_COMPARABLE_INCLUDED }}} === 분석 & 잡담 === == civa.lang.Object == {{{~cpp #ifndef CIVA_LANG_OBJECT_INCLUDED #define CIVA_LANG_OBJECT_INCLUDED #include "../CivaDef.h" namespace civa { namespace lang { class Object { public: void getClass() {/*차후 추가 Class getClass()*/} virtual int getHashCode() { return reinterpret_cast(this); } virtual bool equals(Object_Handle obj) { return (this == obj.get()); } virtual String_Handle toString() { /*차후 추가*/ //return getClass().getName() + "@" + Integer.toHexString(hashCode()); } void notify() {/*차후 추가*/} void notifyAll() {/*차후 추가*/} void wait(long timeout) throw() {/*차후 추가*/} //InterruptedException void wait(long timeout, int nanos) throw() { //InterruptedException if (timeout < 0) { throw ;//new IllegalArgumentException("timeout value is negative"); } if (nanos < 0 || nanos > 999999) { throw ;//new IllegalArgumentException("nanosecond timeout value out of range"); } if (nanos >= 500000 || (nanos != 0 && timeout == 0)) { timeout++; } wait(timeout); } void wait() throw() { //InterruptedException wait(0); } protected: virtual Object_Handle clone() throw() { throw ; //CloneNotSupportedException //으음. 클론에이블 인터페이스 구현여부를 어떻게 판단하지 -_-;; return Object_Handle(new Object(*this)); } virtual void finalize() throw() {/*아무것도 안함*/ } //Throwable public: virtual ~Object() {} }; }} // namespace civa::lang #endif // CIVA_LANG_OBJECT_INCLUDED }}} === 분석 & 잡담 === * 일단 시작... 멀티쓰레드 관련 메소드와 클래스는 못할 듯. 과연 어디까지 할라나... * wait 메소드의 저 사기 나노세컨을 보라. -_- 왜 만든거지, 미래의 대비인가... * C++ 에서 throw 타입을 고정시킬 수 있나... * 메소드 오버라이딩 금지 시킬 수 있나.. == civa.lang.String == {{{~cpp #ifndef CIVA_LANG_STRING_INCLUDED #define CIVA_LANG_STRING_INCLUDED #include "Object.h" #include "../io/Serializable.h" #include "Comparable.h" #include "CharSequence.h" #include "Array.h" namespace civa { namespace lang { class String : public Object, civa::io::Serializable, Comparable, CharSequence { private: /** The value is used for character storage. */ charArray_Handle value; /** The offset is the first index of the storage that is used. */ int offset; /** The count is the number of characters in the String. */ int count; /** Cache the hash code for the string */ int hash; public: String() : hash(0) { value = charArray_Handle(new Array(0)); } }; }} // namespace civa::lang #endif // CIVA_LANG_STRING_INCLUDED }}} === 분석 & 잡담 === == civa.lang. == === 분석 & 잡담 === WIPI 에서 ATOC 를 지금 네가 하는것처럼 수행한다더구만 --;; .. --["neocoin"] ---- ["프로젝트분류"], ["lostship"]