欢迎来到皮皮网网首页

【黄埔海关溯源码】【用谷歌查看源码】【google查看源码乱码】stringstream 源码

来源:arraylist源码解析 时间:2024-11-23 15:53:03

1.easylogging源码学习笔记(6)
2.BSONBSON c++ 代码分析

stringstream 源码

easylogging源码学习笔记(6)

       `LOG` 是源码默认日志、CLOG自定义日志、源码LOG_IF条件日志

       特殊日志

       LOG_EVERY_N、源码LOG_AFTER_N、源码LOG_N_TIMES

       for (int i = 1; i <= ; ++i) {

       LOG_EVERY_N(2,源码 INFO) << "Logged every second iter";

       }// 5 logs written; 2, 4, 6, 7,

       for (int i = 1; i <= ; ++i) {

       LOG_AFTER_N(2, INFO) << "Log after 2 hits; " << i;

       }// 8 logs written; 3, 4, 5, 6, 7, 8, 9,

       for (int i = 1; i <= ; ++i) {

       LOG_N_TIMES(3, INFO) << "Log only 3 times; " << i;

       }// 3 logs writter; 1, 2, 3

       条件日志和特殊日志可以搭配使用

       * `VLOG_IF(condition, verbose-level)`

       * `CVLOG_IF(condition, verbose-level, loggerID)`

       * `VLOG_EVERY_N(n, verbose-level)`

       * `CVLOG_EVERY_N(n, verbose-level, loggerID)`

       * `VLOG_AFTER_N(n, verbose-level)`

       * `CVLOG_AFTER_N(n, verbose-level, loggerID)`

       * `VLOG_N_TIMES(n, verbose-level)`

       * `CVLOG_N_TIMES(n, verbose-level, loggerID)`

       日志详细等级判定

       if (VLOG_IS_ON(2)) {

       // Verbosity level 2 is on for this file

       }

       性能追踪

       * `TIMED_FUNC(obj-name)`

       * `TIMED_SCOPE(obj-name, block-name)`

       * `TIMED_BLOCK(obj-name, block-name)`

       这些宏实际上都是关于el::base::type::PerformanceTrackerPtr,一个指向el::base::PerformanceTracker的源码黄埔海关溯源码指针

       #if defined(ELPP_FEATURE_ALL) || defined(ELPP_FEATURE_PERFORMANCE_TRACKING)

       PerformanceTracker::PerformanceTracker(const std::string& blockName,

       base::TimestampUnit timestampUnit,

       const std::string& loggerId,

       bool scopedLog, Level level) :

       m_blockName(blockName), m_timestampUnit(timestampUnit), m_loggerId(loggerId), m_scopedLog(scopedLog),

       m_level(level), m_hasChecked(false), m_lastCheckpointId(std::string()), m_enabled(false) {

       #if !defined(ELPP_DISABLE_PERFORMANCE_TRACKING) && ELPP_LOGGING_ENABLED

       // We store it locally so that if user happen to change configuration by the end of scope

       // or before calling checkpoint, we still depend on state of configuration at time of construction

       el::Logger* loggerPtr = ELPP->registeredLoggers()->get(loggerId, false);

       m_enabled = loggerPtr != nullptr && loggerPtr->m_typedConfigurations->performanceTracking(m_level);

       if (m_enabled) {

       base::utils::DateTime::gettimeofday(&m_startTime);

       }

       #endif // !defined(ELPP_DISABLE_PERFORMANCE_TRACKING) && ELPP_LOGGING_ENABLED

       }

       在构造函数中获取一个时间,

       PerformanceTracker::~PerformanceTracker(void) {

       #if !defined(ELPP_DISABLE_PERFORMANCE_TRACKING) && ELPP_LOGGING_ENABLED

       if (m_enabled) {

       base::threading::ScopedLock scopedLock(lock());

       if (m_scopedLog) {

       base::utils::DateTime::gettimeofday(&m_endTime);

       base::type::string_t formattedTime = getFormattedTimeTaken();

       PerformanceTrackingData data(PerformanceTrackingData::DataType::Complete);

       data.init(this);

       data.m_formattedTimeTaken = formattedTime;

       PerformanceTrackingCallback* callback = nullptr;

       for (const std::pair& h

       : ELPP->m_performanceTrackingCallbacks) {

       callback = h.second.get();

       if (callback != nullptr && callback->enabled()) {

       callback->handle(&data);

       }

       }

       }

       }

       #endif // !defined(ELPP_DISABLE_PERFORMANCE_TRACKING)

       }

       在析构函数中获取一个时间,源码处理时间data,源码使用PerformanceTrackingCallback类型指针callback,源码并在callback->handle(&data)中处理输出。源码

       由于定义了ELPP_FEATURE_PERFORMANCE_TRACKING,源码因此在初始化(INITIALIZE_EASYLOGGINGPP)中实际上是源码安装了一个base::DefaultPerformanceTrackingCallback。

       在PerformanceTracker类的源码用谷歌查看源码handle函数中,callback是源码一个PerformanceTrackingCallback类型指针,由于安装的源码是DefaultPerformanceTrackingCallback对象,因此是一个基类指针指向了派生类对象。处理输出的逻辑在DefaultPerformanceTrackingCallback类的handle函数中。

       DefaultPerformanceTrackingCallback类的handle函数首先会将数据成员m_data的指针赋值给函数参数,并创建一个base::type::stringstream_t类型的google查看源码乱码对象ss用于构建输出内容。根据m_data的dataType,输出不同的信息。在输出时,会使用el::base::Writer类构造并输出内容。

BSONBSON c++ 代码分析

       MongoDB源代码中包含了BSON(Binary JSON)代码库,通过包含"bson.h"头文件即可访问其中的tnsorflow人脸检测源码功能。

       关键类包括:

       mongo::BSONObj:用于表示BSON对象。

       mongo::BSONElement:表示BSON对象中元素的方法。

       mongo::BSONObjBuilder:构建BSON对象的类。

       mongo::BSONObjIterator:遍历BSON对象中元素的迭代器。

       创建BSON对象的方式有多种:

       BSONObjBuilder b; b.append("name","lemo"); b.append("age",); BSONObj p = b.obj();

       BSONObj p = BSONObjBuilder().append("name","lemo").append("age",).obj();

       BSONObjBuilder b; b << "name" << "lemo" << "age" << ; BSONObj p = b.obj();

       BSONObj p = BSON( "name" << "Joe" << "age" << );

       关键类BSONObj的内部结构如下:

       totalSize:表示总字节数,包括自身。手机照片浏览源码

       BSONType:对象类型,如Boolean、String、Date等。

       FieldName:字段名。

       Data:具体数据存储,根据不同的BSONType。

       BSONObjBuilder集成了StringBuilder,用于构建实际的字节点,替代了std::stringstream。StringBuilder内部是动态增长内存缓冲区,最大容量为MB。

       BSONObjIterator提供类似STL迭代器的接口,用于遍历BSONObj对象中的元素。此外,还提供了一个ForEach宏,简化了操作,如:

       if (foo) { BSONForEach(e, obj) doSomething(e); }

       综上所述,MongoDB的BSON代码库提供了一套高效、灵活的JSON和二进制数据处理机制,为开发者提供了丰富的API和工具,以实现复杂的数据存储和检索功能。