============================================================
 FlyingHttpServer - lightweight HTTP server based on C++
------------------------------------------------------------
                                               by smg_ykz
============================================================

1. Introduction

This software is intended to be a lightweight C++ based HTTP server.
Although there are number of open-source based HTTP server softwares available,
what this software is trying to address is the following.

(a) By making use of the OOP design and generic/meta- programming techniques/idioms,
 it tries to keep the software some sort of extensible, and yet easy-to-maintain.

(b) It tries to be of help in case some embedded device has to deploy HTTP server.
 So in this sense, conventional CGI support which may be useful for scripting language
 such as Perl, Python, Ruby etc. should be some low priority.

(c) It tries to help programmers who are involved in this software get some hints on
 their daily programming.

2. Dependency

In order to keep the software good quality, it is essential that the software don't have
pretty much dependency on the other software components. The following are software
components which are identified as essential.

(a) CMake - http://www.cmake.org
 This is the build system we are going to use.

(b) Googlemock - http://code.google.com/p/googlemock/
 For the purpose of performing unit testing, we use this mocking framework. This software
 component also includes Googletest.

3. How to proceed with the things

Quality over Time - based on this belief, we are (perhaps only I'm...?) supposed to develop
this software. That indicates that the project will be slowly kept on going, which might not
attract users... Excuse me, in advance.

We are going to maintain the source code tree so that this software can be built succesfully
by multiple comipler collections. The followings are the compilation collections which are
being used for the build.

GNU GCC (running under MAC OS X)
 i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.1.00)
CLANG (running under MAC OS X)
 Apple clang version 3.0 (tags/Apple/clang-211.12) (based on LLVM 3.0svn)
 Target: x86_64-apple-darwin11.4.2
 Thread model: posix 
GNU GCC (running under CentOS 5.0)
 gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-50)
GNU GCC44 (running under CentOS 5.0)
 gcc44 (GCC) 4.4.6 20110731 (Red Hat 4.4.6-3)

Before going into the very HTTP server development, firstly we are going to develop and/or
maintain the framework component, which should help the software some sort of good quality
etc.

4. (Sub-)Packages

In this softeware, packages are explicitly divided into different namespaces. The following
briefly shows what kind of packages are there in the software.

[mt] -> Meta-programming library

This is the software package mainly focuses on providing meta/generic-programming components.
In that sense, almost all of them should be in the form of header files so that client code
can instantiate the module along with its parameterized type.

Basically I like to use so-called Typelist very much whose idea was elaborated in the authoritative
book named as 'Modern C++ Design - by Andrei Andrescu'. See how we can manipulate 'type' in
compilation time in the unit test code 'inc/test/mt_typelist_test.cpp'. (TODO:
put some more unit tests there)

[cm] -> Common library

This is the software package that supports various 'aspects'. So in that sense, this should play
a role as core framework library under this software.

cm_thread (libcm_thread.a) - Thread library which wraps several pthread APIs. Along with this
libary you will be able to also use 'inc/cm_thread_specific_data.h'
template library so that you can handle Thread-Specific Data storage per 'types'. See the unit
test code in 'cm/test/cm_thread_specific_data_test.cpp' for some hint.

cm_event (libcm_event.a) - Event library which currently wraps epoll APIs (for Linux) and kqueue,kevent
APIs (for xxxBSD). This will be helpful to construct a event-driven basis programming styles. As
for Event types which can be used in conjunction with the Event class will be also provided in future.

