Example #1
0
    vector<int> grayCode(int n) {
        vector<int> res;
        if(n == 0) {
            res.push_back(0);
            return res;
        }
        
        if(n == 1) {
            res.push_back(0);
            res.push_back(1);
            return res;
        }

        res.push_back(0);
        res.push_back(1);

        for(int i = 2; i <= n; ++i) {
            for(int j = Power2(i - 1) - 1; j >= 0; --j) {
                res.push_back(Power2(i - 1) + res[j]);
            }
        }
        
        return res;
    }
Example #2
0
int Clng ( char *Str ,int n ){
	char s[10];int ns = 0; int ret = 0;
	while(!(Str[n] == '\0' )  && ns < 10){
		switch (Str[n]){
		case '0': s[ns] = 0 ;ns++;break;case '1': s[ns] = 1 ;ns++;break;  
		case '2': s[ns] = 2 ;ns++;break;case '3': s[ns] = 3 ;ns++;break;  
		case '4': s[ns] = 4 ;ns++;break;case '5': s[ns] = 5 ;ns++;break;  
		case '6': s[ns] = 6 ;ns++;break;case '7': s[ns] = 7 ;ns++;break;  
		case '8': s[ns] = 8 ;ns++;break;case '9': s[ns] = 9 ;ns++;break;   
		}
		n++;
	}
	int ss = 0;ns--;
	while(ns >= 0){
		ret += s[ns] * Power2(10,ss);
		ns--; ss++;
	}
	return ret ;
}
Example #3
0
block* complex::Merge(node* n)
{
   list<block*> sub_blocks;
   Recurse(n,&sub_blocks,0);

   list<block*>::iterator sbit=sub_blocks.begin();
//   if (sbit==sub_blocks.end())
//     exit(1);

   block* b=new block(BC(*sbit),this);
//    block* b=new block(*((*sbit)->bc),this);
//   assert(b->bdry_verts.Empty());
//   (b->bc)->SetAs(BC(*sbit));
   BC(b).SetAs(BC(*sbit));
   for(int i=0;i<DIM;++i)
     BC(b)++;
   int level=(cube_bits-BC(b).Bits())/DIM;
   for(int i=0;i<level*DIM;++i)
     BC(b)--;
   BC(b).Coordinates(min);
   for(int i=0;i<level*DIM;++i)
     BC(b)++;

   vertex* v;
   int vc[DIM];
   int flag=1;
   cell_iter bvit;
   cell_iter cit;
   cobdry_iter cbit;

   while(sbit!=sub_blocks.end())
     {
	bvit=(*sbit)->bdry_verts.Begin();
	while(bvit!=(*sbit)->bdry_verts.End())
	  {
             v=(vertex*)(*bvit);
	     v->bc->Coordinates(vc);
	     flag=1;
	     for (int i=0; i<DIM; ++i)
	       flag*=(((min[i]<vc[i])&&(vc[i]<min[i]+Power2(level)))||((vc[i]==0)||(vc[i]==Power2(cube_bits/DIM))));
             if (flag)
	       {
		  if (!(v->Interior()))
		    {
		       v->MarkInterior();
		       DeleteVertex(v);
		       b->cells[0].InsertUniqueSort(v);
		    }
	       }
	     else
	       b->bdry_verts.InsertUniqueSort(v);
	     ++bvit;
	  }
	for(int i=0;i<DIM;++i)
	   {
 	      cit=(*sbit)->cells[i].Begin();
	      while(cit!=(*sbit)->cells[i].End())
	         {
	            b->cells[i].InsertUniqueSort(Ptr(cit));
	            ++cit;
	         }
	   }
	++sbit;
     }

   cit=b->cells[0].Begin();
   while(cit!=b->cells[0].End())
     {
	cbit=((vertex*)(*cit))->Cobdry()->Begin();
//      cout << "size " << (*cit)->Cobdry()->Size() << endl;
	while(cbit!=((vertex*)(*cit))->Cobdry()->End())
	   {
	      ((edge*)Ptr(cbit))->MarkInterior();
//	      b->cells[1].InsertUniqueSort(Ptr(cbit));
	      if (b->cells[1].Find(Ptr(cbit))==b->cells[1].End())
		{
		   b->cells[1].InsertUniqueSort(Ptr(cbit));
		}
	      ++cbit;
	   }
	++cit;
     }
   
   cit=b->cells[1].Begin();
   while(cit!=b->cells[1].End())
     {
	cbit=((edge*)(*cit))->Cobdry()->Begin();
//      cout << "size " << (*cit)->Cobdry()->Size() << endl;
	while(cbit!=((edge*)(*cit))->Cobdry()->End())
	   {
	      ((ncell*)Ptr(cbit))->MarkInterior();
//	      b->cells[2].InsertUniqueSort(Ptr(cbit));
	      if (b->cells[2].Find(Ptr(cbit))==b->cells[2].End())
		{
		   b->cells[2].InsertUniqueSort(Ptr(cbit));
		}
	      ++cbit;
	   }
	++cit;
     }	
	
   for(int i=3;i<DIM;++i)
     {
	cit=b->cells[i-1].Begin();
	while(cit!=b->cells[i-1].End())
	  {
	     cbit=((ncell*)(*cit))->Cobdry()->Begin();
//             cout << "size " << (*cit)->Cobdry()->Size() << endl;
	     while(cbit!=((ncell*)(*cit))->Cobdry()->End())
	       {
		  ((ncell*)Ptr(cbit))->MarkInterior();
//		  b->cells[i].InsertUniqueSort(Ptr(cbit));
		  if (b->cells[i].Find(Ptr(cbit))==b->cells[i].End())
		    {
		       b->cells[i].InsertUniqueSort(Ptr(cbit));
		    }
		  ++cbit;
	       }
	     ++cit;
	  }
     }
   
   if (n==cubes.Root)
     cubes.Root=b;
   else
     {
       node* parent=n->Parent;
       if (parent->Left==n)
         parent->Left=b;
       else
         parent->Right=b;
       b->Parent=parent;	
     }	
   
   Delete(n,0);
   
   return(b);	
}
Example #4
0
		const float32 CVector2D::GetVectorLengthSq() const{
			return Power2(this->X) + Power2(this->Y);
		}
Example #5
0
/**
 * Perform algebraic simplification and strenth reduction
 */
Symbol Simplify(Type ty, int opcode, Symbol src1, Symbol src2)
{
	VariableSymbol t;
	Symbol p1, p2;
	int c1, c2;

	if (IsRealType(ty))
		goto add_value;

	if (src2 == NULL || (src2->kind != SK_Constant && opcode != SUB))
		goto add_value;

	switch (opcode)
	{
	case ADD:
		// a + 0 = a
		if (src2->val.i[0] == 0)
			return src1;

		// a + c1 + c2 = a + (c1 + c2)
		// a - c1 + c2 = a + (-c1 + c2)
		p1 = src1; c1 = 0;
		if (src1->kind == SK_Temp)
		{
			t = AsVar(src1);

			if (t->def->src2 && t->def->src2->kind == SK_Constant && 
			    (t->def->op == ADD || t->def->op == SUB))
			{
				p1 = t->def->src1;
				c1 = (t->def->op == ADD ? 1 : -1) * t->def->src2->val.i[0];
			}
		}
		if (c1 != 0)
		{
			src1 = p1;
			src2 = IntConstant(c1 + src2->val.i[0]);
		}
		break;

	case SUB:
		// a - 0 = a
		if (src2->kind == SK_Constant && src2->val.i[0] == 0)
			return src1;

		// put source operand into v + c format (v maybe NULL, c maybe 0)
		p1 = src1; c1 = 0;
		if (src1->kind == SK_Temp)
		{
			t = AsVar(src1);
			if (t->def->src2 && t->def->src2->kind == SK_Constant && 
			    (t->def->op == ADD || t->def->op == SUB))
			{
				p1 = t->def->src1;
				c1 = (t->def->op == ADD ? 1 : -1) * t->def->src2->val.i[0];
			}
		}
		else if (src1->kind == SK_Constant)
		{
			p1 = NULL;
			c1 = src1->val.i[0];
		}
		p2 = src2; c2 = 0;
		if (src2->kind == SK_Temp)
		{
			t = AsVar(src2);
			if (t->def->src2 && t->def->src2->kind == SK_Constant && 
			    (t->def->op == ADD || t->def->op == SUB))
			{
				p2 = t->def->src1;
				c2 = (t->def->op == ADD ? 1 : -1) * t->def->src2->val.i[0];
			}
		}
		else if (src2->kind == SK_Constant)
		{
			p2 = NULL;
			c2 = src2->val.i[0];
		}

		if (p1 == p2)
		{
			// (a + c1) - (a + c2) = c1 - c2
			return IntConstant(c1 - c2);
		}
		else if (p1 == NULL)
		{
			// c1 - (a + c2) = (c1 - c2) - a
			src1 = IntConstant(c1 - c2);
			src2 = p2;
		}
		else if (p2 == NULL)
		{
			// (a + c1) - c2 = a + (c1 - c2)
			src1 = p1;
			opcode = ADD;
			src2 = IntConstant(c1 - c2);
		}
		break;

	case MUL:
	case DIV:
		// a * 1 = a; a / 1 = a;
		if (src2->val.i[0] == 1)
			return src1;

		// a * 2 power of n = a >> n
		c1 = Power2(src2->val.i[0]);
		if (c1 != 0)
		{
			src2 = IntConstant(c1);
			opcode = opcode == MUL ? LSH : RSH;
		}
		break;

	case MOD:
		// a % 1 = 0
		if (src2->val.i[0] == 1)
			return IntConstant(0);

		// a % 2 power of n = a & (2 power of n - 1)
		c1 = Power2(src2->val.i[0]);
		if (c1 != 0)
		{
			src2 = IntConstant(src2->val.i[0] - 1);
			opcode = BAND;
		}
		break;

	case LSH:
	case RSH:
		// a >> 0 = a << 0 = a
		if (src2->val.i[0] == 0)
			return src1;
		break;

	case BOR:
		// a | 0 = a; a | -1 = -1
		if (src2->val.i[0] == 0)
			return src1;
		if (src2->val.i[0] == -1)
			return src2;
		break;

	case BXOR:
		// a ^ 0 = a
		if (src2->val.i[0] == 0)
			return src1;
		break;

	case BAND:
		// a & 0 = 0, a & -1 = a
		if (src2->val.i[0] == 0)
			return IntConstant(0);
		if (src2->val.i[0] == -1)
			return src1;
		break;

	default:
		break;
	}

add_value:
	return TryAddValue(ty, opcode, src1, src2);
}
Example #6
0
/* 算数优化 */
Symbol Simplify (Type ty, int opcode, Symbol src1, Symbol src2)
{
	VariableSymbol  t;
	Symbol          p1, p2;
	int             c1, c2;

    /* 浮点 */
	if (IsRealType (ty))
		goto add_value;

	if (src2 == NULL || (src2->kind != SK_Constant && opcode != SUB))
		goto add_value;

    /* 以下是 加, 减, 乘, 除, 取余, 左移, 右移, 按位操作的优化 */
	switch (opcode) {

    	case ADD: {
		
            /* a + 0 = a */
		    if (src2->val.i[0] == 0)
			    return src1;

		    /* a + c1 + c2 = a + (c1 + c2) */
    		/* a - c1 + c2 = a + (-c1 + c2) */
		    p1 = src1; c1 = 0;
    		if (src1->kind == SK_Temp) {

                t = AsVar(src1);
    			if (t->def->src2 && t->def->src2->kind == SK_Constant && 
    			    (t->def->op == ADD || t->def->op == SUB)) {

    				p1 = t->def->src1;
	    			c1 = (t->def->op == ADD ? 1 : -1) * t->def->src2->val.i[0];
			    }
		    }
		
            if (c1 != 0) {

    			src1 = p1;
                /* 合并c1, c2 */
	    		src2 = IntConstant (c1 + src2->val.i[0]);
		    }
        }break;

    	case SUB: {

    		/* a - 0 = a */
	    	if (src2->kind == SK_Constant && src2->val.i[0] == 0)
		    	return src1;

    		// put source operand into v + c format (v maybe NULL, c maybe 0)
    		p1 = src1; c1 = 0;
	    	if (src1->kind == SK_Temp) {

    			t = AsVar(src1);
	    		if (t->def->src2 && t->def->src2->kind == SK_Constant && 
		    	    (t->def->op == ADD || t->def->op == SUB)) {

    				p1 = t->def->src1;
	    			c1 = (t->def->op == ADD ? 1 : -1) * t->def->src2->val.i[0];
		    	}
		    } else if (src1->kind == SK_Constant) {

    			p1 = NULL;
	    		c1 = src1->val.i[0];
		    }

    		p2 = src2; c2 = 0;
	    	if (src2->kind == SK_Temp) {

    			t = AsVar(src2);
	    		if (t->def->src2 && t->def->src2->kind == SK_Constant && 
		    	    (t->def->op == ADD || t->def->op == SUB)) {

    				p2 = t->def->src1;
	    			c2 = (t->def->op == ADD ? 1 : -1) * t->def->src2->val.i[0];
		    	}
		    } else if (src2->kind == SK_Constant) {

    			p2 = NULL;
	    		c2 = src2->val.i[0];
		    }

		    if (p1 == p2) {

    			/* (a + c1) - (a + c2) = c1 - c2 */
	    		return IntConstant (c1 - c2);
		    } else if (p1 == NULL) {

                /* c1 - (a + c2) = (c1 - c2) - a */
			    src1 = IntConstant (c1 - c2);
			    src2 = p2;
		    } else if (p2 == NULL) {

    			/* (a + c1) - c2 = a + (c1 - c2) */
	    		src1    = p1;
		    	opcode  = ADD;
			    src2    = IntConstant(c1 - c2);
		    }
        }break;

    	case MUL: case DIV: {

    		/* a * 1 = a; a / 1 = a; */
	    	if (src2->val.i[0] == 1)
		    	return src1;

    		/* a * 2 power of n = a >> n */
	    	c1 = Power2 (src2->val.i[0]);
		    if (c1 != 0) {
			
                /* 转换乘除为位移操作 */
                src2   = IntConstant (c1);
			    opcode = opcode == MUL ? LSH : RSH;
		    }
        }break;

	    case MOD: {

		    /* a % 1 = 0 */
		    if (src2->val.i[0] == 1)
			    return IntConstant (0);

    		/* a % 2 power of n = a & (2 power of n - 1) */
	    	c1 = Power2 (src2->val.i[0]);
		    if (c1 != 0) {

    			src2 = IntConstant (src2->val.i[0] - 1);
	    		opcode = BAND;
		    }
        }break;

    	case LSH: case RSH: {

    		/* a >> 0 = a << 0 = a */
	    	if (src2->val.i[0] == 0)
		    	return src1;
    	}break;

    	case BOR: {

            /* a | 0 = a; a | -1 = -1 */
    		if (src2->val.i[0] == 0)
	    		return src1;
		    if (src2->val.i[0] == -1)
			    return src2;
        }break;

    	case BXOR: {
	
            /* a ^ 0 = a */
		    if (src2->val.i[0] == 0)
    			return src1;
        }break;

    	case BAND: {

            /* a & 0 = 0, a & -1 = a */
    		if (src2->val.i[0] == 0)
	    		return IntConstant(0);
            if (src2->val.i[0] == -1)
			    return src1;
        }break;

    	default: break;
	}

add_value:
    /* 构造值添加到符号表中,并返回 */
	return TryAddValue (ty, opcode, src1, src2);
}
Example #7
0
static void
InitializeScreen(Game* game)
{
  const int bpp = 32;

  VALUE rbScreen = game->screen;
  const Texture* screen;
  Data_Get_Struct(rbScreen, Texture, screen);
  strb_CheckDisposedTexture(screen);
  const int width  = screen->width;
  const int height = screen->height;
  int screenWidth = 0;
  int screenHeight = 0;

  Uint32 options = 0;
  options |= SDL_OPENGL;
  if (game->isFullscreen) {
    options |= SDL_HWSURFACE | SDL_FULLSCREEN;
    game->windowScale = 1;    
    SDL_Rect** modes = SDL_ListModes(NULL, options);
    if (!modes) {
      rb_raise(rb_eRuntimeError, "not supported fullscreen resolution");
    }
    if (modes != (SDL_Rect**)-1) {
      for (int i = 0; modes[i]; i++) {
        int realBpp = SDL_VideoModeOK(modes[i]->w, modes[i]->h, bpp, options);
        if (width <= modes[i]->w && height <= modes[i]->h && realBpp == bpp) {
          screenWidth  = modes[i]->w;
          screenHeight = modes[i]->h;
        } else {
          break;
        }
      }
      if (screenWidth == 0 || screenHeight == 0) {
        rb_raise(rb_eRuntimeError, "not supported fullscreen resolution");
      }
    } else {
      // any resolution are available
      screenWidth  = width;
      screenHeight = height;
    }
  } else {
    screenWidth  = width  * game->windowScale;
    screenHeight = height * game->windowScale;
    options |= SDL_SWSURFACE;
  }

  SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
  SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
  SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
  SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
  SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, game->isVsync ? 1 : 0);

  game->sdlScreen = SDL_SetVideoMode(screenWidth, screenHeight,
                                     bpp, options);
  if (!game->sdlScreen) {
    rb_raise_sdl_error();
  }
  SDL_PixelFormat* format = game->sdlScreen->format;
  game->sdlScreenBuffer = SDL_CreateRGBSurface(SDL_SWSURFACE,
                                               Power2(width),
                                               Power2(height),
                                               bpp,
                                               format->Bmask, format->Gmask, format->Bmask, format->Amask);
  if (!game->sdlScreenBuffer) {
    rb_raise_sdl_error();
  }

  glClearColor(0.0, 0.0, 0.0, 0.0);
  glOrtho(0.0, screenWidth, screenHeight, 0.0, -1.0, 1.0);
  glEnable(GL_TEXTURE_2D);
  glGenTextures(1, &game->glScreen);
  glBindTexture(GL_TEXTURE_2D, game->glScreen);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
}