⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 collectionproxy.h

📁 cint...昨天看到有个c++解释器,叫CINT,down下来一用,很爽,推荐大家也去看一看。 相信不少朋友们早就知道这个东西了
💻 H
📖 第 1 页 / 共 2 页
字号:
// @(#)root/reflex:$Name:  $:$Id: CollectionProxy.h,v 1.16 2006/07/05 07:09:08 roiser Exp $// Author: Markus Frank 2004// Copyright CERN, CH-1211 Geneva 23, 2004-2006, All rights reserved.//// Permission to use, copy, modify, and distribute this software for any// purpose is hereby granted without fee, provided that this copyright and// permissions notice appear in all copies and derivatives.//// This software is provided "as is" without express or implied warranty.#ifndef ROOT_Reflex_CollectionProxy#define ROOT_Reflex_CollectionProxy 1 1#include <cstddef>// Forward declarationsnamespace std {   template <class T, class A>  class deque;   template <class T, class A>  class vector;   template <class T, class A>  class list;   template <class T, class A>  class queue;   template <class T, class A>  class stack;   template <class K, class T, class A>  class set;   template <class K, class T, class A>  class multiset;   template <class K, class T, class R, class A>  class map;   template <class K, class T, class R, class A>  class multimap;   template <class T> class allocator;}// Hash map forward declarations#if defined(__GNUC__)namespace __gnu_cxx {  // GNU GCC   template <class T, class F, class E, class A>  class hash_set;   template <class T, class F, class E, class A>  class hash_multiset;   template <class K, class T, class F, class E, class A>  class hash_map;   template <class K, class T, class F, class E, class A>  class hash_multimap;}#elif  defined(_WIN32)namespace stdext {     // Visual C++   template <class K, class T, class A>  class hash_set;   template <class K, class T, class A>  class hash_multiset;   template <class K, class T, class R, class A>  class hash_map;   template <class K, class T, class R, class A>  class hash_multimap;}#endifnamespace ROOT {   namespace Reflex  {#ifndef __CINT__      template <typename T> struct Environ  {         typedef T           Iter_t;         char                buff[64];         size_t              idx;         size_t              size;         void*               object;         void*               start;         void*               temp;         bool                delete_temp;         int                 refSize;         size_t              space;         T& iter() { return *(T*)buff; }      };#else       template <typename T> struct Environ;#endif      template <typename T> struct Address {         static void* address(T ref) {            return (void*)&ref;         }      };      template <class T> struct CollType #ifdef _KCC  // KAI compiler         : public Address<typename T::value_type&> #else          : public Address<typename T::const_reference> #endif       {         typedef T                               Cont_t;         typedef typename T::iterator            Iter_t;         typedef typename T::value_type          Value_t;         typedef ROOT::Reflex::Environ<Iter_t>   Env_t;         typedef Env_t                          *PEnv_t;         typedef Cont_t                         *PCont_t;         typedef Value_t                        *PValue_t;         static inline PCont_t object(void* ptr)   {            return PCont_t(PEnv_t(ptr)->object);         }         static void* size(void* env)  {            PEnv_t  e = PEnv_t(env);            e->size   = PCont_t(e->object)->size();            return &e->size;         }         static void* clear(void* env)  {            object(env)->clear();            return 0;         }         static void* first(void* env)  {            PEnv_t  e = PEnv_t(env);            PCont_t c = PCont_t(e->object);            // Assume iterators do not need destruction            ::new(e->buff) Iter_t(c->begin());             e->size  = c->size();            if ( 0 == e->size ) return e->start = 0;#ifdef _KCC  // KAI compiler            typename T::value_type& ref = *(e->iter());#else            typename T::const_reference ref = *(e->iter());#endif            return e->start = address(ref);         }         static void* next(void* env)  {            PEnv_t  e = PEnv_t(env);            PCont_t c = PCont_t(e->object);            for (; e->idx > 0 && e->iter() != c->end(); ++(e->iter()), --e->idx );            // TODO: Need to find something for going backwards....            if ( e->iter() == c->end() ) return 0;#ifdef _KCC  // KAI compiler            typename T::value_type& ref = *(e->iter());#else            typename T::const_reference ref = *(e->iter());#endif            return address(ref);         }         static void* construct(void* env)  {            PEnv_t  e = PEnv_t(env);            PValue_t m = PValue_t(e->start);            for (size_t i=0; i<e->size; ++i, ++m)                 ::new(m) Value_t();            return 0;         }         static void* collect(void* env)  {            PEnv_t   e = PEnv_t(env);            PCont_t  c = PCont_t(e->object);            PValue_t m = PValue_t(e->start);            for (Iter_t i=c->begin(); i != c->end(); ++i, ++m )               ::new(m) Value_t(*i);            return 0;         }         static void* destruct(void* env)  {            PEnv_t   e = PEnv_t(env);            PValue_t m = PValue_t(e->start);            for (size_t i=0; i < e->size; ++i, ++m )               m->~Value_t();            return 0;         }      };      /** @class TCollectionProxy::Map TCollectionProxy.h TCollectionProxy.h        *       * Small helper to encapsulate all necessary data accesses for        * containers like vector, list, deque       *       * @author  M.Frank       * @version 1.0       * @date    10/10/2004       */      template <class T> struct Pushback : public CollType<T> {         typedef T                      Cont_t;         typedef typename T::iterator   Iter_t;         typedef typename T::value_type Value_t;         typedef Environ<Iter_t>        Env_t;         typedef Env_t                 *PEnv_t;         typedef Cont_t                *PCont_t;         typedef Value_t               *PValue_t;         static void* resize(void* env)  {            PEnv_t  e = PEnv_t(env);            PCont_t c = PCont_t(e->object);            c->resize(e->size);            e->idx = 0;            return e->start = address(*c->begin());         }         static void* feed(void* env)  {            PEnv_t   e = PEnv_t(env);            PCont_t  c = PCont_t(e->object);            PValue_t m = PValue_t(e->start);            for (size_t i=0; i<e->size; ++i, ++m)               c->push_back(*m);            return 0;         }         static int value_offset()  {            return 0;         }      };      /** @class TCollectionProxy::Map TCollectionProxy.h TCollectionProxy.h        *       * Small helper to encapsulate all necessary data accesses for        * containers like set, multiset etc.       *       * @author  M.Frank       * @version 1.0       * @date    10/10/2004       */      template <class T> struct Insert : public CollType<T> {         typedef T                      Cont_t;         typedef typename T::iterator   Iter_t;         typedef typename T::value_type Value_t;         typedef Environ<Iter_t>        Env_t;         typedef Env_t                 *PEnv_t;         typedef Cont_t                *PCont_t;         typedef Value_t               *PValue_t;         static void* feed(void* env)  {            PEnv_t   e = PEnv_t(env);            PCont_t  c = PCont_t(e->object);            PValue_t m = PValue_t(e->start);            for (size_t i=0; i<e->size; ++i, ++m)               c->insert(*m);            return 0;         }         static void* resize(void* /* env */ )  {            return 0;         }         static int value_offset()  {            return 0;         }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -