Index: content/renderer/render_view_observer_tracker.h |
=================================================================== |
--- content/renderer/render_view_observer_tracker.h (revision 0) |
+++ content/renderer/render_view_observer_tracker.h (revision 0) |
@@ -0,0 +1,67 @@ |
+// 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. |
+ |
+// Helper class used to find the RenderViewObservers for a given RenderView. |
+// |
+// Example usage: |
+// |
+// class MyRVO : public RenderViewObserver, |
+// public RenderViewObserverTracker<MyRVO> { |
+// ... |
+// }; |
+// |
+// RENDER_VIEW_OBSERVER_TRACKER_MAP(MyRVO); |
jam
2011/04/05 18:10:07
I like this approach a lot more, very nice :)
Can
Lei Zhang
2011/04/05 21:03:16
I couldn't put it in the constructor, but I put it
jam
2011/04/05 21:08:35
wouldn't putting it in the header, outside any cla
Matt Perry
2011/04/07 01:32:21
Since it's declared as a static member in the clas
|
+// |
+// MyRVO::MyRVO(RenderView* render_view) |
+// : RenderViewObserver(render_view), |
+// RenderViewObserverTracker<SearchBox>(render_view) { |
+// ... |
+// } |
+// |
+// void SomeFunction(RenderView* rv) { |
+// MyRVO* my_rvo = new MyRVO(rv); |
+// MyRVO* my_rvo_tracked = MyRVO::Get(rv); |
+// // my_rvo == my_rvo_tracked |
+// } |
+ |
+#ifndef CONTENT_RENDERER_RENDER_VIEW_OBSERVER_TRACKER_H_ |
+#define CONTENT_RENDERER_RENDER_VIEW_OBSERVER_TRACKER_H_ |
+#pragma once |
+ |
+#include <map> |
+ |
+#include "base/lazy_instance.h" |
+ |
+class RenderView; |
+ |
+#define RENDER_VIEW_OBSERVER_TRACKER_MAP(ClassType) \ |
+ template <> \ |
+ base::LazyInstance<std::map<RenderView*, ClassType*> > \ |
+ RenderViewObserverTracker<ClassType>::render_view_map_( \ |
+ base::LINKER_INITIALIZED) |
+ |
+template <class T> |
+class RenderViewObserverTracker { |
+ public: |
+ static T* Get(RenderView* render_view) { |
+ return render_view_map_.Get()[render_view]; |
+ } |
+ |
+ explicit RenderViewObserverTracker(RenderView* render_view) |
+ : render_view_(render_view) { |
+ render_view_map_.Get()[render_view] = static_cast<T*>(this); |
+ } |
+ ~RenderViewObserverTracker() { |
+ render_view_map_.Get().erase(render_view_); |
+ } |
+ |
+ private: |
+ RenderView* render_view_; |
+ |
+ static base::LazyInstance<std::map<RenderView*, T*> > render_view_map_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(RenderViewObserverTracker<T>); |
+}; |
+ |
+#endif // CONTENT_RENDERER_RENDER_VIEW_OBSERVER_TRACKER_H_ |
Property changes on: content/renderer/render_view_observer_tracker.h |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |