Program Listing for File LoopTreeHoldNode.h

Program Listing for File LoopTreeHoldNode.h#

Return to documentation for file (src/midend/programTransformation/loopProcessing/computation/LoopTreeHoldNode.h)

#ifndef LOOP_TREE_HOLDNODE_OBSERVER
#define LOOP_TREE_HOLDNODE_OBSERVER

#include <stdlib.h>
#include <LoopTreeObserver.h>

class HoldTreeNodeObserver : public LoopTreeObserver
{
  LoopTreeNode *node;
 protected:
  void UpdateDeleteNode( const LoopTreeNode *n ) { node = 0; }
 public:
  HoldTreeNodeObserver( LoopTreeNode *n, LoopTreeObserver *_next = 0)
     : LoopTreeObserver(_next){ node = n; node->AttachObserver(*this); }
  HoldTreeNodeObserver() { node = 0; }
  ~HoldTreeNodeObserver()
      {
         if (node != 0)
            node->DetachObserver( *this );
      }

  LoopTreeNode * GetTreeNode() const { return node;}
  void ResetHoldTreeNode( LoopTreeNode *n)
      {
        if (node != 0)
           node->DetachObserver( *this );
        node = n;
        if (node != 0)
           node->AttachObserver( *this );
      }
};

class HoldLoopAlignObserver : protected HoldTreeNodeObserver
{
  int align;

  void UpdateMergeLoop( const MergeLoopInfo &info)
       {
          LoopTreeNode *l = info.GetNewLoop();
          ResetHoldTreeNode( l );
          align += info.GetMergeAlign();
       }
 public:
  HoldLoopAlignObserver( LoopTreeNode *n, int _align,
                         LoopTreeObserver *_next = 0)
     : HoldTreeNodeObserver( n, _next ) { align = _align; }
  ~HoldLoopAlignObserver() {}

  int GetLoopAlign() const { return align; }
  void SetLoopAlign( int a ) { align = a; }
};

class HoldAncesLoopObserver : protected HoldLoopAlignObserver
{
  LoopTreeNode *desc;

  void UpdateDistNode(const DistNodeInfo &info)
      {
        const LoopTreeNode *orig = info.GetObserveNode();
        LoopTreeNode *nloop = info.GetNewNode();
        LoopTreeNode *n = desc->Parent();
        for ( ;  n != nloop && n != orig; n = n->Parent()) ;
        if (n == nloop)
            ResetHoldTreeNode( nloop );
       }
 public:
  HoldAncesLoopObserver( LoopTreeNode *l, int _align,
                         LoopTreeNode *_desc, LoopTreeObserver *h=0)
   : HoldLoopAlignObserver ( l, _align, h), desc(_desc) {}
  ~HoldAncesLoopObserver() {}

  LoopTreeNode* GetAncesLoop() const { return GetTreeNode(); }
  LoopTreeNode* GetDescNode() const  { return desc; }
  using HoldLoopAlignObserver::GetLoopAlign;
  using HoldLoopAlignObserver::SetLoopAlign;
};

#endif