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

📄 traversal.cpp

📁 ACE自适配通信环境(ADAPTIVE Communication Environment)是可以自由使用、开放源码的面向对象(OO)框架(Framework)
💻 CPP
字号:
// file      : Example/Introspection/Traversal/Traversal.cpp// author    : Boris Kolpackov <boris@kolpackov.net>// copyright : Copyright (c) 2002-2003 Boris Kolpackov// license   : http://kolpackov.net/license.html#include "Traversal.hpp"#include <set>#include <map>using namespace Utility::Introspection;namespace Traversal{  // Dispatcher  //  //  struct TypeInfoComparator  {    bool    operator () (TypeInfo const& x, TypeInfo const& y) const    {      return x.type_id () < y.type_id ();    }  };  typedef  std::map<TypeInfo, unsigned long, TypeInfoComparator>  LevelMap;  typedef  std::set<TypeInfo, TypeInfoComparator>  TypeInfoSet;  unsigned long  compute_levels (TypeInfo const& ti, unsigned long cur, LevelMap& map)  {    unsigned long ret = cur;    if (map.find (ti) == map.end () || map[ti] < cur) map[ti] = cur;    for (TypeInfo::BaseIterator i = ti.begin_base ();         i != ti.end_base ();         i++)    {      unsigned long t = compute_levels (i->type_info (), cur + 1, map);      if (t > ret) ret = t;    }    return ret;  }  void  flatten_tree (TypeInfo const& ti, TypeInfoSet& set)  {    set.insert (ti);    for (TypeInfo::BaseIterator i = ti.begin_base ();         i != ti.end_base ();         i++)    {      flatten_tree (i->type_info (), set);    }  }  void Dispatcher::  dispatch (SyntaxTree::Node* n)  {    LevelMap levels;    unsigned long max = compute_levels (n->type_info (), 0, levels);    for (unsigned long l = 0; l < max + 1; l++)    {      TypeInfoSet dispatched;      for (LevelMap::const_iterator i = levels.begin ();           i != levels.end ();           i++)      {        if (i->second == l)        {          TraversalMap::const_iterator v =            traversal_map_.find (i->first.type_id ());          if (v != traversal_map_.end ())          {            v->second->traverse (n);            flatten_tree (i->first, dispatched);          }        }      }      // Remove traversed types from level map.      for (TypeInfoSet::const_iterator i = dispatched.begin ();           i != dispatched.end ();           i++)      {        levels.erase (*i);      }    }  }}//Traversal.cpp,v 1.1 2005/05/24 04:33:12 turkaye Exp

⌨️ 快捷键说明

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