http://www.cgal.org/

C++ 기반의 계산기하 라이브러리. 전에 컴과 졸업논문 쓰면서 했던게 이쪽 관련된거라 그때 한번 찾아보고 잊고 있었다. 전반적으로는 C++로 아주 잘 짜여진 수학 라이브러리이다. 소스도 공개되어 있으니 한번 분석해 보면 큰 도움이 될듯.
안드로이드로 주소록을 받아오는 것을 해 보고 있다. 기본적으로 이름과 전화번호를 받아 오는것을 만들고 있다. 생각으로는 단체문자하는 어플을 만들고 싶어서 모바일로 등록되어 있는 것만을 가져오고 싶다. 책에서는 People클래스를 이용하는데 deprecated되었다네. 그래서 다른 방법을 찾아보다가 발견한 페이지. http://androiddevblog.blogspot.com/2010/02/query-contacts-data.html 그래서 따라서 해 보았다.
        Cursor contacts = managedQuery(ContactsContract.Contacts.CONTENT_URI, null, "HAS_PHONE_NUMBER=1", null, null);
        MatrixCursor cursor = new MatrixCursor(new String[] {"_id", "name", "phone_number"});        startManagingCursor(cursor);
        if (contacts.moveToFirst()) {
        	String name;
        	String contactId;
        	int nameColumn = contacts.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
         	int idColumn = contacts.getColumnIndex(ContactsContract.Contacts._ID);
        	do {
        		name = contacts.getString(nameColumn);
        		contactId = contacts.getString(idColumn);
        		Cursor phones = getContentResolver().query(
        				ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
        				null,
        				ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + contactId + " AND " +
         				ContactsContract.CommonDataKinds.Phone.TYPE + "=" + ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE ,
        				null,
        				null);
        		if (phones.moveToNext()) {
        			String phoneNumber = phones
        			.getString(phones .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
    				cursor.addRow(new String[] {contactId, name, phoneNumber});
        		}
        		phones.close();
        	} while (contacts.moveToNext());
        }        contacts.close();
쿼리도 두 번 뿐이고 잘 된다. 왠지 조인으로 한번에 하면 될 쿼리를 나눠서 하느나 좀 신경쓰이긴 하지만. 근데 작업 도중 Contacts 를 통해 접근해야만 하는 줄 알았던 DISPLAY_NAME이 ContactsContract.CommonDataKinds.Phone.에도 있는것을 알았다. 음? 설마 하는 마음에 다음과 같이 해 보았다.


        Cursor cursor = managedQuery(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
         		new String[]{ContactsContract.CommonDataKinds.Phone._ID, ContactsContract.CommonDataKinds.Phone.CONTACT_ID,
         			ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
        			ContactsContract.CommonDataKinds.Phone.NUMBER},
        			ContactsContract.CommonDataKinds.Phone.TYPE + "=" + ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE, null, null);
        startManagingCursor(cursor);

잘 된다... 결과도 똑같아... 난 결국 뭘한거지.. ㅠㅠ 알아서 조인해 주는듯 하다. 

업뎃했으면서 변경된 사항도 예제랑 곁들여서 친절히 설명해주면 좋을것을...
Iterators Programming/C/C++ 2010. 6. 18. 17:44
Boost Graph 라이브러리(BGL)와 STL을 사용하면서 느끼는건데...

정말 참 좋긴 한데..

정말 좋은데 ㅋㅋ

근데 사용하기가 쉽지많은 않다.

STL은 제공하는것만 사용하려면 쉬운데(typedef만 좀 해 주면) 

내가 만든 클래스도 iterator를 직접 제공하려고 하는데 이게 STL의 iterator랑 호환되게 하려면

typedef도 좀 해 줘야 하고 operator 오버로딩도 좀 해 줘야 하고

특히 copy같은 algorithm 헤더에 있는 녀석들이 사용하게 하려면

뭔가 추가할게 많다 ㅠㅠ

BGL은 사용하기는 좋은데 descriptor랑 iterator가 막 섞여서 다 까먹고 다시 보려니 

애먹고 있다. 근데 descriptor라는 발상은 좋은데 뭔가 직관적이지는 않다.

그래서 프로그램 짜다 보면 사용자층은 좀더 직관적으로 사용 할 수 있고 추상적인건 숨기게 하려니

코딩량이 좀 많아지는듯.