How to check some function is static member using type_traits



#include <type_traits>

using namespace std;

struct A
{
public:

	A(){}

    static A& singleton() 
	{
		static A obj;

		return obj;
	}


private:
	A(const A&);
	A& operator=(A const&);
};

struct A_1
{
    static A& singleton() 
	{
		static A obj;

		return obj;
	}
};

struct B
{
	B& singleton()
	{
		return *this;
	}
};

struct C
{
	int singleton;
};

void global_func(){}



template<class T>
struct is_function_pointer 
{
private:
	template<class T> 
	struct is_function_pointer_impl
	{
		typedef typename std::remove_pointer<T>::type pointee;
		typedef typename std::is_function<pointee>::type type;
	};

	typedef typename std::conditional
		<std::is_pointer<T>::value, is_function_pointer_impl<T>, std::false_type>
		::type cond_result_t;

public:
	static const bool value = cond_result_t::type::value;
};

template<typename T>
struct has_singleton_accessor
{
private:
	typedef decltype(&T::singleton) func_t;

public:
	static const bool value = is_function_pointer<func_t>::value
						&& !std::is_member_function_pointer<func_t>::value;
};

template<typename T>
struct satisfy_singleton_requirement
{
	enum {
		value = !std::is_trivially_copy_constructible<T>::value
			&&  !std::is_trivially_copy_assignable<T>::value
	};
};


template<typename T>
struct is_singleton
{
	static const bool value = has_singleton_accessor<T>::value
						&&  satisfy_singleton_requirement<T>::value;
};

int main()
{
	static_assert(is_function_pointer<decltype(&A::singleton)>::value, "true.");
	static_assert(is_function_pointer<decltype(&global_func)>::value, "also true.");

	static_assert(is_member_function_pointer<decltype(&B::singleton)>::value
		, "true.");

	static_assert(is_member_function_pointer<decltype(&A::singleton)>::value
		, "but it's false because A::singleton is the static member");

	//therefore:
	static_assert(is_function_pointer<decltype(&A::singleton)>::value
				&& !std::is_member_function_pointer<decltype(&A::singleton)>::value
		, "this is how to check whether A::singleton is static member function.");


	static_assert(is_singleton<A_1>::value, "this type isn't singleton.");	//Err
	static_assert(is_singleton<B>::value, "this type isn't singleton.");	//Err
	static_assert(is_singleton<C>::value, "this type isn't singleton.");	//Err

	static_assert(is_singleton<A>::value, "that's it!");
}

바이오스 포스팅이 느린 경우

Windows 8.1을 쓰기 위해 256g SSD를 설치했더니 바이오스 포스팅이 몇분씩 걸리는 사태가 벌어졌다.

설치가 잘못되었거나 바이오스에 문제가 생겼거나 둘중 하나겠지 싶어 바이오스를 업데이트했는데도 문제가 사라지지 않았다.

그런데 검색결과 CD드라이브의 문제일 수 있다고 한다.

즉시 전원을 끄고 CD드라이브를 연결한 SATA 케이블을 제거했더니 정상속도로 부팅한다.

 

케이스 내부 청소 후 SATA케이블 재배치할 때 CD드라이브까지의 거리가 멀어서 좀 무리해서 끼웠더니 발생했던 문제인 듯 하다.

케이블 하나 때문에 재부팅이 안되거나 제어판이 안열리거나 프로그램 실행이 제대로 안되거나 하는 문제가 발생할 수 도 있음을 알았다.

소프트웨어를 쓰기 위한 도구이지만 본질은 하드웨어의 집합체인 것을 잊었던 듯.

C++11 thread 객체를 static 또는 전역에서 선언했을 때 발생하는 deadlock

참고 : http://stackoverflow.com/questions/10915233/stdthreadjoin-hangs-if-called-after-main-exits-when-using-vs2012-rc

std::thread 객체를 Windows에서 static으로 사용하는 경우.
join을 호출하면 내부 API가 락을 시도하는데, 프로세스 종료 시점에서 join을 시도하면,

  1. main() 이 반환된다.
  2. 메인스레드가 종료를 위해 프로세스 내부적으로 사용되는 특정한 lock을 건다.
  3. 전역 객체들에 대해 소멸자를 호출하는데 소멸자가 std::thread::join을 호출한다면,
  4. child 스레드가 자신의 종료를 위해 프로세스에 lock을 시도하는데 이미 메인스레드가 lock을 잡고있다.
  5. DEADLOCK.

스택오버플로의 게시물에 의하면 Windows에서만 발생하는 문제인 것 같다.

Google C++ 튜토리얼 연습문제


#include <cstdint>
#include <chrono>
#include <iostream>
#include <atomic>
#include <thread>
#include <vector>

using namespace std;
using namespace std::chrono;
typedef duration<float> fsec;

auto started = steady_clock::now();
atomic<int> counter = 0;

inline int GetNumber()
{
	return ++counter;
}

inline int64_t SigmaN(int64_t n) // to avoid overflow
{
	return n * (n + 1) >> 1;
}

int SerialN(int n)
{
	for (int i = 0; i < n ; ++i)
	{
		if (SigmaN(i) == n)
			return i;
	}

	return 0;
}

int IsPerfectSquare(int n)
{
	if (n < 0)
		return 0;

	int root = (int)(sqrt(n));

	return n == root * root ?
					root : 0;
}

void Work()
{
	while (true)
	{
		int number = GetNumber();

		if (0 > number)
			break; // until overflow

		int root = IsPerfectSquare(number);

		if (0 < root)
		{
			auto last_of_serial = SerialN(number);

			if (0 < last_of_serial)
			{
				//print elapsed time
				printf("%d = %d^2 = sum(1..%d)n %0.2f secn",
					number, root, last_of_serial,
					duration_cast<fsec>(steady_clock::now() - started).count()
					);
			}
		}
	}//while
}



int main (void)
{
	const size_t sizeofThread = 9;

	vector<thread> workers;

	for (int i = 0; i < sizeofThread; ++i)
	{
		workers.push_back(thread(Work));
	}

	for (auto& t : workers)
		t.join();
}

굳이 멀티스레드로 돌려본건 cpu 100% 찍어본지가 오래됬기땜에..

Ubuntu/d key shows desktop over Xrdp

구글링으로 답을 찾으려고 해서 상당히 오래 걸렸기에 기록을 해둔다. 우분투 위키에서 답을 찾음.

System Tools/System Settings/Keyboard/Shortcuts/Navigation/Hide all normal windows 라는 항목이 있으나 이 항목의 숏컷을 제거해도 d키를 눌렀을 때 Super(윈도키)+d로 인식하는 상태는 변함이 없다.

global key binding이 따로 있어서 이쪽에서 제거를 해줘야 한다.

System Tools/dconf Editor를 실행하고 org.gnome.desktop.wm.keybindings/show-desktop 항목의 배열을 모두 제거하거나 원하는 다른 내용으로 수정하고 시스템을 재시작하면 더이상 숏컷이 동작하지 않는다.

 

대상 환경 : Ubuntu 13.04

stringstream 사용하기

stringstream을 fstream으로 내보낼 때,

fstream file;
stringstream ss;

file << ss; // 스트림 자체를 덤프할 뿐 스트림 안의 내용이 기록되지 않는다.
file << ss.rdbuf(); // 스트림 안의 버퍼를 덤프한다. 파일에 내용이 제대로 작성된다.

stringstream으로 입력받을 때도 마찬가지. 흔히 내장 타입에 받듯 >>연산자를 사용하지 않고 raw buffer를 그대로 stringstream에 “출력“한다.

fstream file;
stringstream ss;

ss << file.rdbuf(); //보기엔 별로 좋지 않아도 최선의 효율적인 방식.

SyntaxHighlighter Evolved : D Brush

I’ll share my add-on: the D language brush for SyntaxHighlighter Evolved, the WordPress plugin. Author of “Evolved” recommands that instead of adding unsupported/unofficial brushes into third-party-brushes directory of his plugin, users should write a NEW plugin that they need for themselves.

Btw, here’s the file.

shBrushD

You may download this, upload to your WordPress blog, and activate manually. Feel free to use it :)

googletest를 vs2012에서 쓰기

gtest1.6을 vs2012에서 빌드하면
error C2977: ‘std::tuple’ : too many template arguments

따위의 에러를 마구 뱉는다. 스택오버플로에서 찾아보면 MS 블로그의 링크를 주는데, C++11 core feature 중 하나인 variadic template을 VC11이 제대로 지원하지 않기 때문이라고 한다.

Faux Variadic 항목을 참고해 _VARIADIC_MAX=10 정도로 매크로를 정의하면 일단 빌드할 수 있다.

size_t의 정의

왜 size_t를 쓰는가 하는 문제에 대해.

C++11표준 문서 1에 의하면. size_t는 다음과 같이 정의된다.

The type size_t is an implementation-defined unsigned integer type that is large enough to contain the size
in bytes of any object. 2

pros:

  • size_t를 사용하는 것은 해당 변수가 바이트 단위 크기를 표현하는 데 사용할 용도임을 직접 명시하므로 unsigned int를 사용하는 것보다 코드 가독성 향상에 도움이 된다.
  • 아직까지도 x86-32가 주류인 현재, size_t를 사용해 작성한 코드는 x64로 넘어간 후에도 컴파일하는 데 아무런 지장이 없을 것이다.

cons:

당장 생각하면 없는 듯? 취향상의 문제는 있을지도.

 

참고: 임베디드 환경에서의 호환성과 size_t의 문제.

 

 

Notes:

  1. draft. 공짜. 정식은 $30 @ansi.org
  2. 18.2.6항목