Ejemplo n.º 1
0
Features::Features() {
	assert(_all.empty());

	if (parameter::use_item_features()) {
		const FeaturePtrs& l = (FeaturePtrs&)ItemFeatures::instance()->all();
		_all.insert(_all.end(), l.begin(), l.end());
	}

	if (parameter::use_length_features()) {
		const FeaturePtrs& l = (FeaturePtrs&)LengthFeatures::instance()->all();
		_all.insert(_all.end(), l.begin(), l.end());
	}

	if (parameter::use_quant_features()) {
		const FeaturePtrs& l = (FeaturePtrs&)QuantFeatures::instance()->all();
		_all.insert(_all.end(), l.begin(), l.end());
	}

	if (parameter::use_exists_features()) {
		const FeaturePtrs& l = (FeaturePtrs&)ExistsFeatures::instance()->all();
		_all.insert(_all.end(), l.begin(), l.end());
	}

	if (parameter::use_exists_terminal_features()) {
		const FeaturePtrs& l = (FeaturePtrs&)ExistsTerminalFeatures::instance()->all();
		_all.insert(_all.end(), l.begin(), l.end());
	}

	if (parameter::use_item_child_features()) {
		const FeaturePtrs& l = (FeaturePtrs&)ItemChildFeatures::instance()->all();
		_all.insert(_all.end(), l.begin(), l.end());
	}

	if (parameter::use_range_features()) {
		const FeaturePtrs& l = (FeaturePtrs&)RangeFeatures::instance()->all();
		_all.insert(_all.end(), l.begin(), l.end());
	}

	if (parameter::use_terminal_item_features()) {
		const FeaturePtrs& l = (FeaturePtrs&)TerminalItemFeatures::instance()->all();
		_all.insert(_all.end(), l.begin(), l.end());
	}

	for (FeaturePtrs::const_iterator f = _all.begin(); f != _all.end(); f++) {
		_id_to_ptr[(*f)->id()] = *f;
	}
	_id_to_ptr.lock();	// Lock against subsequent writes.
	assert(_all.size() == _id_to_ptr.size());

	this->create_string_map();

	Debug::log(2) << "Features::Features() built " << _all.size() << " features\n";

	EMPTY_FEATURE_ID.create();
	assert(!EMPTY_FEATURE_ID.empty());
}