/*!
\page oess_1__util_cpp_serializer	oess_1: Утилита oess_cpp_serializer

\section oess_1__util_cpp_serializer__name	Название

\b oess_cpp_serializer -- генерация вспомогательного C++ кода по
	DDL-описанию.

\section oess_1__util_cpp_serializer__synopsis	Формат запуска

\verbatim
oess_cpp_serializer <DDL-file> <CPP-file>
\endverbatim

\section oess_1__util_cpp_serializer__description	Описание

Помещает сгенерированный из DLL описания в <i>DDL-file</i> С++ код в 
файл <i>CPP-file</i>.

\section oess_1__util_cpp_serializer__sample	Пример

\verbatim
oess_cpp_serializer src/my_scheme/ddl/my_scheme.ddl src/my_scheme/my_scheme.ddl.cpp
\endverbatim

*/

/*!
\page oess_1__mxx_ru_util_cpp_serializer	oess_1: Генератор вспомогательного кода для mxx_ru

\section oess_1__mxx_ru_util_cpp_serializer__name	Название

<b>Oess_1::Util_cpp_serializer::Gen</b> -- генерация вспомогательного C++ кода
по DDL-описанию для системы поддержки компиляции C++ проектов mxx_ru
(http://eao197.narod.ru/mxx_ru).

\section oess_1__mxx_ru_util_cpp_serializer__synopsis	Формат	

\verbatim
require 'oess_1/util_cpp_serializer/gen.rb'

module	Oess_1
module	Util_cpp_serializer
	# Класс генератора .cpp файлов из .ddl файлов.
	class	Gen < Mxx_ru::Abstract_generator
		def	initialize(
			# Цель, в которую будет входить данный генератор.
			a_target,
			# Расширение, которое нужно использовать для сгенерированных файлов.
			a_cpp_ext = ".cpp" )
			...
		end

		# Добавить очередной файл.
		def	ddl_file( a_file )
			...
		end

		# Сгенерировать из DDL-файлов C++ файлы.
		def	build( target )
			...
		end

		# Удалить сгенерированные из DLL С++ файлы.
		def	clean( target )
			...
		end
	end
end
end

\endverbatim

\section oess_1__mxx_ru_util_cpp_serializer__description	Описание

Класс Oess_1::Util_cpp_serializer::Gen реализует понятие генератора
кода Mxx_ru::Abstract_generator для генерации вспомогательного C++ кода по
DDL-описаниям. Для его использования в проектном файле необходимо:

1. Подключить файл 'oess_1/util_cpp_serializer/gen.rb'.<br>
2. Создать в проектном файле экземпляр объекта
	Oess_1::Util_cpp_serializer::Gen.<br>
3. Указать имена всех ddl-файлов созданному экземпляру генератора.

Из каждого ddl-файла будет получен C++ файл с тем же именем, в том же каталоге,
но с еще одним расширением '.cpp'. Т.е. из файла <tt>a/b/c.ddl</tt>
будет построен файл <tt>a/b/c.ddl.cpp</tt>. Используемое расширение можно
заменить, передав новое значение в конструктор
Oess_1::Util_cpp_serializer::Gen.

\section oess_1__mxx_ru_util_cpp_serializer__sample	Пример

\verbatim
require	'mxx_ru/cpp'

require 'oess_1/version'
require	'oess_1/util_cpp_serializer/gen'

Mxx_ru::setup_target(
	Mxx_ru::Cpp::Dll_target.new( "oess_1/db/prj.rb" ) {

		required_prj( "ace/dll.rb" )

		required_prj( "cls_2/prj.rb" )

		required_prj( "oess_1/defs/prj.rb" )
		required_prj( "oess_1/io/prj.rb" )
		required_prj( "oess_1/file/prj.rb" )
		required_prj( "oess_1/stdsn/prj.rb" )
		required_prj( "oess_1/scheme/prj.rb" )
		required_prj( "oess_1/zlib/prj.rb" )

		required_prj( "threads_1/dll.rb" )

		required_prj( "smart_ref_3/lib.rb" )

		required_prj( "libpcre++/prj.rb" )

		ddl_cpp_generator = generator(
			Oess_1::Util_cpp_serializer::Gen.new( self ) )

		Oess_1::setup_platform( self )

		target( "oess_db" + Oess_1::VERSION )

		define( "OESS_1__DB__PRJ" )

		#
		# Физическое хранилище.
		#

		sources_root( "storage" ) { 
			cpp_source( "loaded_page.cpp" )
			cpp_source( "dirty_page_storage.cpp" )

			cpp_source( "page_index_calculator.cpp" )
			cpp_source( "config.cpp" )
			ddl_cpp_generator.ddl_file( "config.ddl" )

			cpp_source( "chain_storage.cpp" )

			cpp_source( "entity_stream.cpp" )
			cpp_source( "stream_storage.cpp" )

			sources_root( "trx" ) {
				cpp_source( "types.cpp" )
				ddl_cpp_generator.ddl_file( "types.ddl" )

				cpp_source( "find_all_trace_files.cpp" )
				cpp_source( "std_trace_stream.cpp" )

				cpp_source( "std_file_committer.cpp" )
			}

			sources_root( "impl" ) { 
				cpp_source( "cache.cpp" )

				cpp_source( "mem_dirty_page_storage.cpp" )
				cpp_source( "std_cache.cpp" )
				cpp_source( "page_accessor.cpp" )
				cpp_source( "headers.cpp" )
				cpp_source( "header_processor.cpp" )

				cpp_source( "std_chain_storage.cpp" )

				cpp_source( "std_entity_stream.cpp" )
				ddl_cpp_generator.ddl_file( "std_entity_stream.ddl" )

				cpp_source( "stream_storage_dir.cpp" )
				ddl_cpp_generator.ddl_file( "stream_storage_dir.ddl" )

				cpp_source( "std_stream_storage.cpp" )
			}
		}

		sources_root( "impl" ) {

			#
			# Работа с содержимым базы данных.
			#
			sources_root( "db_content" ) {
				cpp_source( "db_content.cpp" )
				cpp_source( "std_client_map.cpp" )
				cpp_source( "std_db_content.cpp" )
			}
		}

		sources_root( "site" ) {

			#
			# Средства коммуникации между клиентом и сервером.
			#

			cpp_source( "abstract_connector.cpp" )
			cpp_source( "localhost.cpp" )

			sources_root( "impl" ) {
				cpp_source( "request.cpp" )
				ddl_cpp_generator.ddl_file( "request.ddl" )
				cpp_source( "response.cpp" )
				ddl_cpp_generator.ddl_file( "response.ddl" )

				cpp_source( "attach_cmd.cpp" )
				ddl_cpp_generator.ddl_file( "attach_cmd.ddl" )
				cpp_source( "detach_cmd.cpp" )
				ddl_cpp_generator.ddl_file( "detach_cmd.ddl" )
				cpp_source( "ent_create_cmd.cpp" )
				ddl_cpp_generator.ddl_file( "ent_create_cmd.ddl" )
				cpp_source( "ent_destroy_cmd.cpp" )
				ddl_cpp_generator.ddl_file( "ent_destroy_cmd.ddl" )
				cpp_source( "ent_load_cmd.cpp" )
				ddl_cpp_generator.ddl_file( "ent_load_cmd.ddl" )
				cpp_source( "ent_update_cmd.cpp" )
				ddl_cpp_generator.ddl_file( "ent_update_cmd.ddl" )
				cpp_source( "ent_find_next_cmd.cpp" )
				ddl_cpp_generator.ddl_file( "ent_find_next_cmd.ddl" )
				cpp_source( "slice_create_cmd.cpp" )
				ddl_cpp_generator.ddl_file( "slice_create_cmd.ddl" )
				cpp_source( "slice_destroy_cmd.cpp" )
				ddl_cpp_generator.ddl_file( "slice_destroy_cmd.ddl" )
				cpp_source( "slice_is_exists_cmd.cpp" )
				ddl_cpp_generator.ddl_file( "slice_is_exists_cmd.ddl" )
				cpp_source( "slice_names_cmd.cpp" )
				ddl_cpp_generator.ddl_file( "slice_names_cmd.ddl" )
				cpp_source( "transaction_cmd.cpp" )
				ddl_cpp_generator.ddl_file( "transaction_cmd.ddl" )

				cpp_source( "std_localhost.cpp" )

				cpp_source( "localhost_connector.cpp" )
			}
		}

		#
		# Клиентская часть.
		#
		sources_root( "cln" ) {
			cpp_source( "db.cpp" )
			cpp_source( "slice_index_base.cpp" )
			cpp_source( "slice_image_base.cpp" )
			cpp_source( "local_db.cpp" )

			sources_root( "impl" ) {
				cpp_source( "std_db.cpp" )
			}
		}
	}
)
\endverbatim

*/
