/**
boost 多索引容器的一般使用
这里使用google 的gmock 库来验证对boost 多索引模板的使用,并验证。
这里是手敲的,可能会有一些字符敲错的情况,编译错误的放,修改一下,同时链接gmock库就可以正常运行了。
当然还需要链接boost 的相关库
**/ #include <stdint.h> #include <gtest/gtest.h>
#include <gmock/gmock.h> #include <boost/multi_index_container.hpp>
#include <boost/multi_index/ordered_index.hpp>
#include <boost/multi_index/member.hpp>
#include <boost/multi_index/composite_key.hpp>
#include <boost/multi_index/global_fun.hpp> // 多索引的结构或者类
struct stru_AccountFeeIncre
{
int64_t nAccountID;
int32_t nGoodsID;
int32_t nGoodsGroupID;
int32_t nFeeMode;
int32_t nTradeMode;
double dFeeValue;
}; // 为索引的Key 定义一个标志类型,类似std::map 的Key
struct tagGoodsID {};
struct tagGoodsGroupID {}; // 声明多索引结构,主要绑定索引类型可以与指定成员的一一映射
using MultiIndexFeeIncre =
boost::multi_index::multi_index_container<
stru_AccountFeeIncre, // 数据结构,用于索引的对象
boost::multi_index::indexed_by< // 创建索引,可以是一个或者多个。分别以',' 分隔
// 创建唯一索引,不允许插入该字段的值相同的两个对象到此容器中。
boost::multi_index::ordered_unique<
boost::multi_index::tag<tagGoodsID>, // 索引标签
BOOST_MULTI_INDEX_MEMBER(struAccountFeeIncre, int32_t, nGoodsID) // 该索引绑定的成员
>,
// 创建非唯一索引,允许多个相同的值到此容器中
boost::multi_index::ordered_non_unique<
boost::multi_index::tag<tagGoodsGroupID>,
BOOST_MULTI_INDEX_MEMBER(stru_AccountFeeIncre, int32_t, nGoodsGroupID)
>
>
>; using C_ITER_FEE_INCRE = MultiIndexFeeIncre::const_iterator;
using PAIR_RANGE_FEE_INCRE = std::pair<C_ITER_FEE_INCRE, C_ITER_FEE_INCRE>;
using C_ITER_ID_FEE_INCRE = MultiIndexFeeIncre::index<tagGoodsID>::type::const_iterator;
using C_ITER_GROUP_FEE_INCRE = MultiIndexFeeIncre::index<tagGoodsGroupID>::type::const_iterator;
using PAIR_RANGE_GROUP_FEE_INCRE = std::pair<C_ITER_GROUP_FEE_INCRE, C_ITER_GROUP_FEE_INCRE>; // 定义多索引容器实例
static MultiIndexFeeIncre s_multiAccountFeeIncre;
// 定义容器的索引实例的引用 - 非const 版本
static MultiIndexFeeIncre::index<tagGoodsID>::type &INDEX_ID_FEE_INCRE = s_multiAccountFeeIncre.get<tagGoodsID>();
static MultiIndexFeeIncre::index<taggoodsGroupID>::type &INDEX_GROUP_FEE_INCRE = s_multiAccountFeeIncre.get<tagGoodsGroupID>();
// 定义容器的索引实例的引用 - const 版本
static const MultiIndexFeeIncre::index<tagGoodsID>::type &C_INDEX_ID_FEE_INCRE = s_multiAccountFeeIncre.get<tagGoodsID>();
static const MultiIndexFeeIncre::index<tagGoodsgroupID>::type &C_INDEX_GROUP_FEE_INCRE = s_multiAccountFeeIncre.get<tagGoodsGroupID>(); // template 版本
MultiIndexFeeIncre::template index<tagGoodsID>::type &TPLT_INDEX_ID = s_multiAccountFeeIncre.template get<taggoodsID>();
MultiIndexFeeIncre::template index<tagGoodsGroupID>::type &TPLT_INDEX_GROUP = s_multiAccountFeeIncre.template get<tagGoodsGroupID>(); TEST(TestBoostUse, MultiIndex)
{
const int32_t GROUP_ID_01 = ;
const int32_t GROUP_ID_02 = ;
int64_t nExpectSize = ; EXPECT_EQ(nExpectSize, s_multiAccountFeeIncre.size()); int64_t nGoodsID = ;
stru_AccountFeeIncre stFeeIncre;
stFeeIncre.nAccountID = ;
stFeeIncre.nGoodsID = nGoodsID;
stFeeIncre.nGoodsGroupID = GROUP_ID_01;
stFeeIncre.nFeeMode = ;
stFeeIncre.nTradeMode = ;
stFeeIncre.dFeeValue = 0.5; // 商品组1
int32_t nExpectSizeGroupID_1 = ;
// 插入一条
s_multiAccountFeeIncre.emplace(stFeeIncre);
++nExpectSize;
++nExpectSizeGroupID_1;
EXPECT_EQ(nExpectSize, s_multiAccountFeeIncre.size()); // 插入与唯一索引相同的值的对象,插入失败
s_multiAccountFeeIncre.emplace(stFeeIncre);
EXPECT_EQ(nExpectSize, s_multiAccountFeeIncre.size()); // 插入一条
++nGoodsID;
stFeeIncre.nGoodsID = nGoodsID;
stFeeIncre.nGoodsGroupID = GROUPID_01; s_multiAccountFeeIncre.emplace(stFeeIncre);
++nExpectSize;
++nExpectSizeGroupID_1;
EXPECT_EQ(nExpectSize, s_multiAccountfeeIncre.size()); // 插入一条
++nGoodsID;
stFeeIncre.nGoodsID = nGoodsID;
stFeeIncre.nGoodsGroupID = GROUP_ID_01; s_multiAccountFeeIncre.emplace(stFeeIncre);
++nExpectSize;
++nExpectSizeGroupID_1;
EXPECT_EQ(nExpectSize, s_multiAccountFeeIncre.size()); // 插入到另一个商品组
int32_t nExpectSizeGroupID_2 = ;
++nGoodsID;
stFeeIncre.nGoodsID = nGoodsID;
stFeeIncre.nGoodsGroupID = GROUP_ID_02; s_multiAccountFeeIncre.emplace(stFeeIncre);
++nExpectSize;
++nExpectSizeGroupID_2;
EXPECT_EQ(nExpectSize, s_multiAccountFeeIncre.size()); // 插入一条
++nGoodsID;
stFeeIncre.nGoodsID = nGoodsID;
stFeeIncre.nGoodsGroupID = GROUP_ID_02; s_multiAccountFeeIncre.emplace(stFeeIncre);
++nExpectSize;
++nExpectSizeGroupID_2;
EPXECT_EQ(nEpxectSize, s_multiAccountFeeIncre.size()); // 查询
do
{
// 唯一索引的查询,结果仅有一条记录
int nTempGoodsID = ;
C_ITER_ID_FEE_INCRE c_iter_id = INDEX_ID_FEE_INCRE.find(nTempGoodsID);
ASSERT_NE(c_iter_id, INDEX_ID_FEE_INCRE.end()); // 非唯一索引的查询,结果为一组记录
PAIR_RANGE_GROUP_FEE_INCRE range = TPLT_INDEX_GROUP.equal_range(GROUP_ID_01);
int nTempSize = ;
for (auto it = range.first; it != range.second; ++it)
{
EXPECT_EQ(GROUP_ID_01, it->nGoodsGroupID);
++nTempSize;
} EXPECT_EQ(nExpectSizeGroupID_1, nTempSize);
}
while (false); // 修改
do
{
// 拷贝副本
MultiIndexFeeIncre bak_multiAccountFeeIncre = s_multiAccountFeeIncre;
int32_t bakExpectSize = nExpectSize;
int32_t nTempGoosdID = ; C_ITER_ID_FEE_INCRE c_iter_id = bak_multiAccountFeeIncre.get<tagGoodsID>().find(nTempGoodsID);
EXPECT_NE(c_iter_id, bak_multiAccountFeeIncre.get<tagGoodsID>().end());
if (c_iter_id == bak_multiAccountFeeIncre.get<tagGoodsID>().end())
{
break;
} stru_AccountFeeIncre newObj; // 未设置值使用内存随机值即可
newObj.nGoodsID = c_iter_id->nGoodsID; // 唯一性主键不修改
newObj.nGoodsGroupID = nExpectSizeGroupID_2; // 商品组ID改到2 非唯一性主键修改
bool bResTemp = bak_multiAccountfeeIncre.replace(c_iter_id, newObj);
EXPECT_TRUE(bResTemp);
EXPECT_EQ(bakExpectSize, bak_multiAccountFeeIncre.size());
}
while (false); do
{
// 拷贝副本
MultiIndexFeeIncre bak_multiAccountFeeIncre = s_multiAccountFeeIncre;
int32_t bakExpectSize = nExpectSize;
int32_t nTempGoodsID = ; C_ITER_ID_FEE_INCRE c_iter_id = bak_multiAccountFeeIncre.get<tagGoodsID>().find(nTempGoodsID);
EXPECT_NE(c_iter_id, bak_multiAccountFeeIncre.get<tagGoodsID>().end());
if (c_iter_id == bak_multiAccountFeeIncre.get<tagGoodsID>().end())
{
break;
} stru_AccountFeeIncre newObj;
newObj.nGoodsID = ; // 修改唯一性主键
newObj.nGoodsGroupID = c_iter_id->nGoodsGroupID; // 非唯一性主键不修改
bool bResTemp = bak_multiAccountFeeIncre.replace(c_iter_id, newObj);
EXPECT_TRUE(bResTemp);
EXPECT_EQ(bakExpectSize, bak_multiAccountFeeIncre.size());
}
while (false); // 删除
do
{
// 拷贝副本
MultiIndexFeeIncre bak_multiAccountFeeIncre = s_multiAccountFeeIncre;
int32_t bakExpectSize = nExpectSize;
int32_t bakExpectSizeGroupID_1 = nExpectSizeGroupID_1; // 先删除商品组1 中的一个商品
int nTempGoodsID = ;
C_ITER_ID_FEE_INCRE c_iter_id = bak_multiAccountFeeIncre.get<tagGoodsID>().find(nTempGoodsID);
ASSERT_NE(c_iter_id, bak_multiAccountFeeIncre.get<taggoodsID>().end());
bak_multiAccountFeeIncre.erase(c_iter_id);
--bakExpectSize;
--bakExpectSizeGroupID_1;
EXPECT_EQ(bakExpectSize, bak_multiAccountFeeIncre.size()); // 删除商品组1 的元素
EXPECT_EQ(bakExpectSize, bak_multiAccountFeeIncre.get<tagGroupID>().size());
EXPECT_EQ(bakExpectSize, bak_multiAccountFeeIncre.get<tagGoodsGroupID>().size());
bak_multiAccountFeeIncre.template get<tagGoodsGroupID>().erase(GROUP_ID_01);
bakExpectSize -= bakExpectSizeGroupID_1;
bakExpectSizeGroupID_1 = ;
EXPECT_EQ(bakExpectSize, bak_multiAccountFeeIncre.size());
}
while (false); do
{
// 拷贝副本
MultiIndexFeeIncre bak_multiAccountFeeIncre = s_multiAccountFeeIncre;
int32_t bakExpectSize = nExpectSize;
int32_t bakExpectSizeGroupID_2 = nExpectSizeGroupID_2; // 删除商品组2 的元素
bak_multiAccountFeeIncre.template get<tagGoodsGroupID>().erase(GROUP_ID_02);
bakExpectSize -= bakExpectSizeGroupID_2;
bakExpectSizeGroupID_2 = ;
EXPECT_EQ(bakExpectSize, bak_multiAccountFeeIncre.size());
}
while (false); do
{
// 拷贝副本
MultiIndexFeeIncre bak_multiAccountFeeIncre = s_multiAccountFeeIncre;
int32_t bakGoodsID = nGoodsID;
int32_t bakExpectSize = nExpectSize; // 按唯一性主键: 商品ID 进行删除
do
{
bak_multiAccountFeeIncre.template get<tagGoodsID>().erase(bakGoodsID);
--bakExpectSize;
EXPECT_EQ(bakExpectSize, bak_multiAccountFeeIncre.size());
}
while (--bakGoodsID > );
}
while (false);
} int main(int argc, char *argv[])
{
testing::InitGoodsMock(&argc, argv); return RUN_ALL_TESTS();
}

boost multi_index的更多相关文章

  1. 使用boost::multi_index高速构建排行榜

    使用boost::multi_index高速构建排行榜 前几天在boost的maillist上看到boost::multi_index将要支持ranked_index(邮件内容见附件2),这实乃我等苦 ...

  2. 用 boost::multi_index 管理玩家

    用 boost::multi_index 管理玩家(金庆的专栏)网游服务器上的玩家集合需要多种索引:如用ID查找,角色名查找, 用登录时分配的会话ID查找.用boost::multi_index进行玩 ...

  3. boost::multi_index 多索引容器

    #include "stdafx.h" #include <string> #include <boost/multi_index_container.hpp&g ...

  4. boost::multi_index 提供一种千人在线即时排行榜的设计思路

    原文地址: http://www.limerence2017.com/2019/06/23/cpp01/ 做游戏或金融后台开发,经常会遇到设计开发排行榜的需求.比如玩家的充值排行,战力排行等等.而这种 ...

  5. boost multi_index 插入返回值

    boost multi_index 对象插入函数emplace() 的返回值,是一个std::pair<iterator, bool>该pair 的first 是一个插入成功的位置,第二个 ...

  6. boost multi_index简单了解

    #include <string> #include <iostream> #include <boost/multi_index_container.hpp> # ...

  7. Boost练习程序(multi_index_container)

    代码来自:http://blog.csdn.net/whuqin/article/details/8482547 该容器能实现多列索引,挺好. #include <string> #inc ...

  8. boost asio 异步实现tcp通讯

    ---恢复内容开始--- asioboost   目录(?)[-] 一前言 二实现思路 通讯包数据结构 连接对象 连接管理器 服务器端的实现 对象串行化   一.前言 boost asio可算是一个简 ...

  9. boost multi index

    Boost.MultiIndex makes it possible to define containers that support an arbitrary number of interfac ...

随机推荐

  1. Day24_多线程第一天

    1.线程 1.概述      宏观来讲      进程:就是正在运行的程序      线程:就是进程的执行路径,执行单元 2.创建并启动线程的两种方式(掌握)      1.定义一个类继承Thread ...

  2. 如何控制JVM中的JIT行为?

    首先交代一下我自己的测试环境: Ubuntu 12.04 x86-64,OpenJDK 7 64-bit Server VM(mixed mode) MacOS  10.11,HotSpot  7 6 ...

  3. linux挂着U盘和光盘

    挂载光盘 mkdir /mnt/cdrom/ (建立挂载点) mount -t iso9660 /dev/cdrom /mnt/cdrom (挂载光盘) mount /dev/sr0 /mnt/cdr ...

  4. Python循环语句

    1.Python循环类型 1.while循环:在某条件下,循环执行某段程序 a. while语句有两个重要命令:continue,break来跳出循环. continue用来跳出该次循环 break用 ...

  5. php学习前的准备

    1.用户文档: 官方中文文档:http://www.php.net/manual/zh/ 官方扩展库:http://pecl.php.net/packages.php

  6. 第五篇T语言实例开发,数组空间使用

    数组空间使用 排序算法 在实际中,当有多个无序数据时.我们就需要多数据进行排序 典型的排序:冒泡排序 排序原理 冒泡排序算法的运作如下:(从后往前) 比较相邻的元素.如果第一个比第二个大,就交换他们两 ...

  7. 初识Linux—1

    1,Ctrl+C作用是终止当前的命令 2,ps显示目前正在执行的程序(命令)(process status) 3,退出是exit,连续按exit,最终会关闭终端 4,Root是管理员,其他的用户都是由 ...

  8. C++知识点

    typedef typedef struct _COMSTAT { DWORD fCtsHold : ; //机构内位域的定义即变量fCtsHold占1个bit空间 DWORD fDsrHold : ...

  9. pyqt4:线程的串联运行方式

    有些时候我们在pyqt中需要线程串行运行,而不是并发运行,用以下方式,这是在网上找的,暂存. > Hello > I have something like the foll scenar ...

  10. OkHttp和Volley对比

    OkHttp 物理质量 使用OkHttp需要 okio.jar (80k), okhttp.jar(330k)这2个jar包,总大小差不多400k,加上自己的封装,差不多得410k. 功能介绍 Squ ...