先熟悉set的find原理

http://www.cnblogs.com/Clingingboy/p/3252136.html

这个类改造下,还是非常实用的,可以对于不同的类型做数据存储

一.ViewProp

// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. #ifndef UI_BASE_VIEW_PROP_H_
#define UI_BASE_VIEW_PROP_H_ namespace ui { // ViewProp maintains a key/value pair for a particular view. ViewProp is
// designed as a replacement for the Win32's SetProp
, but does not make use of
// window manager memory. ViewProp shares similar semantics as SetProp, the
// value for a particular view/key pair comes from the last ViewProp created.
class UI_EXPORT ViewProp {
public:
// Associates data with a view/key pair. If a ViewProp has already been
// created for the specified pair |data| replaces the current value.
//
// ViewProp does *not* make a copy of the char*, the pointer is used for
// sorting.
ViewProp(gfx::AcceleratedWidget view, const char* key, void* data);
~ViewProp(); // Returns the value associated with the view/key pair, or NULL if there is
// none.
static void* GetValue(gfx::AcceleratedWidget view, const char* key); // Returns the key.
const char* Key() const; private:
class Data; // Stores the actual data.
scoped_refptr<Data> data_;
}; } // namespace ui #endif // UI_BASE_VIEW_PROP_H_

二.实现

ViewProp::ViewProp(gfx::AcceleratedWidget view, const char* key, void* data) {
Data::Get(view, key, true, &data_);
data_->set_data(data);
} ViewProp::~ViewProp() {
// This is done to provide similar semantics to SetProp. In particular it's
// assumed that ~ViewProp should behave as though RemoveProp was invoked.
data_->set_data(NULL);
} // static
void* ViewProp::GetValue(gfx::AcceleratedWidget view, const char* key) {
scoped_refptr<Data> data;
Data::Get(view, key, false, &data);
return data.get() ? data->data() : NULL;
} // static
const char* ViewProp::Key() const {
return data_->key();
}

三.测试代码

TEST(ViewPropTest, Basic) {
gfx::AcceleratedWidget nv1 = reinterpret_cast<gfx::AcceleratedWidget>(1);
void* data1 = reinterpret_cast<void*>(11);
// Register a value for a view/key pair.
const char kKey1[] = "key_1";
ViewProp prop(nv1, kKey1, data1);
EXPECT_EQ(data1, ViewProp::GetValue(nv1, kKey1));
}
  1. 构建一个ViewProp
  2. 然后使用ViewProp::GetValue静态方法查找

四.Data类的实现

ViewProp构造函数用Data::Get创建Data,查找的时候还是用Data::Get方法,区别在于构造函数时创建,查找时不会创建

// Maints the actual view, key and data.
class ViewProp::Data : public base::RefCounted<ViewProp::Data> {
public:
// Returns the Data* for the view/key pair. If |create| is false and |Get|
// has not been invoked for the view/key pair, NULL is returned.
static void Get(gfx::AcceleratedWidget view,
const char* key,
bool create,
scoped_refptr<Data>* data) {
if (!data_set_)
data_set_ = new DataSet;
scoped_refptr<Data> new_data(new Data(view, key));
DataSet::const_iterator i = data_set_->find(new_data.get());
if (i != data_set_->end()) {
*data = *i;
return;
}
if (!create)
return;
data_set_->insert(new_data.get());
*data = new_data.get();
} // The data.
void set_data(void* data) { data_ = data; }
void* data() const { return data_; } const char* key() const { return key_; } private:
friend class base::RefCounted<Data>; // Used to order the Data in the map.
class DataComparator {
public:
bool operator()(const Data* d1, const Data* d2) const {
return (d1->view_ == d2->view_) ? (d1->key_ < d2->key_) :
(d1->view_ < d2->view_);
}
}; typedef std::set<Data*, DataComparator> DataSet; Data(gfx::AcceleratedWidget view, const char* key)
: view_(view),
key_(key),
data_(NULL) {} ~Data() {
DataSet::iterator i = data_set_->find(this);
// Also check for equality using == as |Get| creates dummy values in order
// to look up a value.
if (i != data_set_->end() && *i == this)
data_set_->erase(i);
} // The existing set of Data is stored here. ~Data removes from the set.
static DataSet* data_set_; const gfx::AcceleratedWidget view_;
const char* key_;
void* data_; DISALLOW_COPY_AND_ASSIGN(Data);
}; // static
ViewProp::Data::DataSet* ViewProp::Data::data_set_ = NULL;

chrome ui源码剖析-ViewProp的更多相关文章

  1. chrome ui源码剖析-Accelerator(快捷键)

      好久没有自己写东西了,chrome有着取之不尽的技术精华供学习,记录一下. 源码目录: http://src.chromium.org/viewvc/chrome/trunk/src/ui/bas ...

  2. Google Chrome源码剖析【序】

    [序(本人什么都没做,完全转载)] 开源是口好东西,它让这个充斥着大量工业垃圾代码和教材玩具代码的行业,多了一些艺术气息和美的潜质.它使得每个人,无论你来自米国纽约还是中国铁岭,都有机会站在巨人的肩膀 ...

  3. Spark源码剖析 - SparkContext的初始化(三)_创建并初始化Spark UI

    3. 创建并初始化Spark UI 任何系统都需要提供监控功能,用浏览器能访问具有样式及布局并提供丰富监控数据的页面无疑是一种简单.高效的方式.SparkUI就是这样的服务. 在大型分布式系统中,采用 ...

  4. Chrome V8 引擎源码剖析

    Chrome V8 引擎源码剖析 V8 https://github.com/v8/v8 array & sort https://github.com/v8/v8/search?l=Java ...

  5. (升级版)Spark从入门到精通(Scala编程、案例实战、高级特性、Spark内核源码剖析、Hadoop高端)

    本课程主要讲解目前大数据领域最热门.最火爆.最有前景的技术——Spark.在本课程中,会从浅入深,基于大量案例实战,深度剖析和讲解Spark,并且会包含完全从企业真实复杂业务需求中抽取出的案例实战.课 ...

  6. Appuim源码剖析(Bootstrap)

    Appuim源码剖析(Bootstrap) SkySeraph Jan. 26th 2017 Email:skyseraph00@163.com 更多精彩请直接访问SkySeraph个人站点:www. ...

  7. 老李推荐:第14章1节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-面向控件编程VS面向坐标编程

    老李推荐:第14章1节<MonkeyRunner源码剖析> HierarchyViewer实现原理-面向控件编程VS面向坐标编程   poptest是国内唯一一家培养测试开发工程师的培训机 ...

  8. 老李推荐:第2章2节《MonkeyRunner源码剖析》了解你的测试对象: NotePad窗口Activity之NotesList简介

    老李推荐:第2章2节<MonkeyRunner源码剖析>了解你的测试对象: NotePad窗口Activity之NotesList简介   NotePad窗口Activity之NotesL ...

  9. 老李推荐: 第1章1节《MonkeyRunner源码剖析》概述:前言

    老李推荐: 第1章1节<MonkeyRunner源码剖析>概述:前言   前言 相信大家做过安卓移动平台UI自动化开发的必然会用过,至少听过MonkeyRunner这个名字.MonkeyR ...

随机推荐

  1. C++笔试易错题集(持续更新)

    1.如下代码输出结果是什么? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #include<stdio.h> char *myString() {     ...

  2. FTP主动/被动原理

    FTP 主动模式 1.客户端用大于1024的高位端口发起初始化连接到vsftp服务器的21端口 2.vsftp服务器的21端口主动与客户端大于1024的高位端口建立控制连接 3.vsftp服务器的20 ...

  3. linux sftp安装【转】

    工具:虚拟机:VMware Workstation Pro.操作系统:CentOS-6.4-x86_64-minimal.终端模拟器:Xshell 5 .ftp:filezilla 一.让虚拟机联网 ...

  4. python文件操作及格式化输出

    1 文件与IO 1.1读写文本数据 读写各种不同的文本数据,如ASCII,UTF-8,UTF-9编码等. 使用带有rt模式的open()函数读取文本文件. 例如: with open('db', 'r ...

  5. JavaEE-案例1-网站信息展示

    案例1-网站信息展示 需求: 在页面上展示一些文字信息,需要排版. 技术分析: html:超文本 标签 语言 作用:展示 超文本:超越了一般文本,描述文本的字体.颜色.图片 标签:标记 html书写规 ...

  6. Nginx安装及常用命令

    一.选定源码目录 cd /usr/local/src 可以是任何目录,本文选定的是/usr/local/src 二.安装依赖库 yum install gcc yum install pcre-dev ...

  7. 《MySQL技术内幕 InnoDB存储引擎 》学习笔记

    第1章  MySQL体系结构和存储引擎 1.3 MySQL存储引擎 数据库和文件系统最大的区别在于:数据库是支持事务的 InnoDB存储引擎: MySQL5.5.8之后默认的存储引擎,主要面向OLTP ...

  8. WebApi 文档Swagger

    NET WebApi 文档Swagger中度优化   本文版权归博客园和作者吴双本人共同所有,转载和爬虫请注明原文地址:www.cnblogs.com/tdws   写在前面 在后台接口开发中,接口文 ...

  9. jqplot导入包小结

    对于jqplot画图的导入包,总结起来就是两种,一种是每个jsp文件都是导入一样的js或css包!这些包可以另新建一个文件存放,有如下这些包! <link rel="styleshee ...

  10. rabbitmq学习(四) —— 发布订阅

    为了说明这种模式,我们将建立一个简单的日志系统.这个系统将由两个程序组成,第一个将发出日志消息,第二个将接收并处理日志消息.在我们的日志系统中,每一个运行的接收程序的副本都会收到日志消息. 交换器(E ...