confparse

#example.conf
key0=v0
key1=v1,v2
[TT]
key2=v2
key3=v3

#example1.conf
key0=v0
key1=v1,v2
key3=v3

/*************************************************************************
    > File Name: confparse.h
    > Author: wangzhicheng
    > Mail: 2363702560@qq.com 
    > Created Time: Wed 12 Jul 2017 08:29:26 PM AWST
 ************************************************************************/
#ifndef CONF_PARSE_H
#define CONF_PARSE_H
#include <string>
#include <vector>
#include <map>
#include <set>
#include <fstream>
#include <sstream>
#include <algorithm>
namespace confparse
{
using namespace std;
class ConfParse;
class InnerKey
{
	friend class ConfParse;
private:
	map<string, set<string> >m_mapInner;	// key -- inner key value -- inner value
private:
	inline void Insert(const string &key, const set<string>&value)
	{
		m_mapInner.insert(make_pair(key, value));
	}
	inline void Clear()
	{
		m_mapInner.clear();
	}
	inline bool Empty()
	{
		return m_mapInner.empty();
	}
	void GetValue(const string &key, vector<string>&value);
};
class ConfParse
{
private:
	char m_cCommentChar;					// comment line generally #
	char m_cSplitChar_kv;					// split char between key and value generally =
	char m_cSplitChar_vv;					// split char between value and value generally ,
	map<string, InnerKey>m_mapConf;			// key -- outside key
public:
	ConfParse(char comment = '#', char split0 = '=', char split1 = ','):
		m_cCommentChar(comment), m_cSplitChar_kv(split0), m_cSplitChar_vv(split1)
	{
	}
	/*
	 * @brief read conf file and init m_mapConf
	 * */
	bool Init(const char *filename);
	/*
	 * @brief locate value
	 * */
	void GetValue(const string &firstkey, const string &secondkey, vector<string>&values);
	~ConfParse()
	{
	}
};
}
#endif

/*************************************************************************
    > File Name: confparse.cpp
    > Author: wangzhicheng
    > Mail: 2363702560@qq.com 
    > Created Time: Wed 12 Jul 2017 08:29:26 PM AWST
 ************************************************************************/
#include "confparse.h"
namespace confparse
{
void InnerKey::GetValue(const string &key, vector<string>&value)
{
	auto it = m_mapInner.find(key);
	if(it == m_mapInner.end()) return;
	set<string>&_value = it->second;
	value.clear();
	value.resize(_value.size());
	copy(begin(_value), end(_value), begin(value));
}
bool ConfParse::Init(const char *filename)
{
	if(!filename) return false;
	ifstream fstream(filename);
	if(!fstream) return false;
	string line;
	string newline;
	string lastfirstkey;
	string firstkey;
	string secondkey;
	string value;
	string::size_type size, pos;
	set<string>values;
	InnerKey innerKey;	
	m_mapConf.clear();
	while(!fstream.eof())
	{
		fstream >> line;
		if(line.empty()) continue;		// skip empty line
		if('#' == line[0]) continue;	// skip comment line
		size = line.size();
		// get [key]
		if(('[' == line[0]) && (']' == line[size - 1]))
		{
			firstkey.assign(line, 1, size - 2);
			if(lastfirstkey != firstkey)	// a new [] begin
			{
				m_mapConf.insert(make_pair(lastfirstkey, innerKey));		
				lastfirstkey = firstkey;
				innerKey.Clear();
			}
			continue;
		}
		// get inner key and values
		if((pos = line.find(m_cSplitChar_kv)) != string::npos)
		{
			secondkey.assign(line, 0, pos);
			newline.assign(line, pos + 1, size);
			for(auto it = begin(newline);it != end(newline);++it)
			{
				if(m_cSplitChar_vv == *it) *it = ' ';
			}
			istringstream ss(newline);
			values.clear();
			while(ss >> value) 
			{
				values.insert(value);
			}
			innerKey.Insert(secondkey, values);
		}
		line.clear();
	}
	if(!innerKey.Empty()) m_mapConf.insert(make_pair(firstkey, innerKey));		
	fstream.close();
	return !m_mapConf.empty();
}
void ConfParse::GetValue(const string &firstkey, const string &secondkey, vector<string>&values)
{
	values.clear();
	auto it = m_mapConf.find(firstkey);
	if(it == m_mapConf.end()) return;
	InnerKey &innerKey = it->second;
	innerKey.GetValue(secondkey, values);
}
}

TEST(ConfParse, TestInit)
{
	const char *path = "/home/wangzhicheng/C++/simple/confParse/example.conf";
	ConfParse confParse;
	EXPECT_EQ(true, confParse.Init(path));
}
TEST(ConfParse, TestGet)
{
	vector<string>values;
	const char *path = "/home/wangzhicheng/C++/simple/confParse/example.conf";
	ConfParse confParse;
	EXPECT_EQ(true, confParse.Init(path));
	confParse.GetValue("", "key0", values);
	EXPECT_EQ(1, values.size());
	EXPECT_EQ("v0", values[0]);
	confParse.GetValue("", "key1", values);
	EXPECT_EQ(2, values.size());
	EXPECT_EQ("v2", values[1]);
	confParse.GetValue("TT", "key3", values);
	EXPECT_EQ("v3", values[0]);
	EXPECT_EQ(1, values.size());

	path = "/home/wangzhicheng/C++/simple/confParse/example1.conf";
	EXPECT_EQ(true, confParse.Init(path));
	confParse.GetValue("", "key1", values);
	EXPECT_EQ("v2", values[1]);
	EXPECT_EQ(2, values.size());
}


**高校专业实习管理平台设计与实现** 本设计项目旨在构建一个服务于高等院校专业实习环节的综合性管理平台。该系统采用当前主流的Web开发架构,基于Python编程语言,结合Django后端框架与Vue.js前端框架进行开发,实现了前后端逻辑的分离。数据存储层选用广泛应用的MySQL关系型数据库,确保了系统的稳定性和数据处理的效率。 平台设计了多角色协同工作的管理模型,具体包括系统管理员、院系负责人、指导教师、实习单位对接人以及参与实习的学生。各角色依据权限访问不同的功能模块,共同构成完整的实习管理流程。核心功能模块涵盖:基础信息管理(如院系、专业、人员信息)、实习过程管理(包括实习公告发布、实习内容规划、实习申请与安排)、双向反馈机制(单位评价与学生反馈)、实习支持与保障、以及贯穿始终的成绩评定与综合成绩管理。 在技术实现层面,后端服务依托Django框架的高效与安全性构建业务逻辑;前端界面则利用Vue.js的组件化特性与LayUI的样式库,致力于提供清晰、友好的用户交互体验。数据库设计充分考虑了实习管理业务的实体关系与数据一致性要求,并保留了未来功能扩展的灵活性。 整个系统遵循规范的软件开发流程,从需求分析、系统设计、编码实现到测试验证,均进行了多轮迭代与优化,力求在功能完备性、系统性能及用户使用体验方面达到较高标准。 **核心术语**:实习管理平台;Django框架;MySQL数据库;Vue.js前端;Python语言。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
在电磁散射与雷达技术的研究中,涉及粗糙表面电磁特性模拟的核心概念包括统计参数化建模方法、不同电场矢量方向的极化模式、特定方向的能量反射现象、理想化波前模型以及具有随机起伏特征的界面。以下是对这些要点的系统阐述: 统计参数化建模是一种基于表面统计特征描述其不规则性的电磁散射计算方法,尤其适用于均方根高度较小的粗糙界面在微波至毫米波频段的散射特性分析。 水平极化与垂直极化分别指电场矢量平行于地面和垂直于地面的振动状态。在雷达探测中,采用不同的极化模式有助于提升目标辨识度并抑制环境干扰。 当电磁波与物体相互作用时,部分能量沿接近入射方向返回,这种现象称为反向散射。其在雷达系统的探测灵敏度与目标特征分析中具有关键作用。 平面波是在均匀介质中传播的理想波型,其电场与磁场分布保持一致的相位关系,常作为理论简化模型用于电磁问题的解析与数值计算。 粗糙界面指具有随机起伏特征的表面,其不规则程度可通过均方根高度进行量化。这种结构特性会改变电磁波的传播路径与能量分布,进而影响信号的接收与处理。 相关压缩文件可能包含了实现上述建模方法的程序代码,通常采用数值计算语言编写,用于模拟不同极化状态下粗糙表面对平面波的反向散射响应。通过此类仿真,能够预测各类场景下的散射参数,为雷达系统设计与遥感数据解译提供理论依据。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值