/*
 * $Id: ObjExistanceInASpc.java,v 1.4 1999/09/22 19:35:09 yamauchi Exp $
 *     (M\pi)^2 : object existance in a space
 *	Copyright 1999 By YAMAUCHI Hitoshi 山内 斉 
 *	@author YAMAUCHI Hitoshi 山内 斉
 *	
 * original source objectInfoInASpace.h
 *
 *	ある空間の物体の存在を示す．geometry と volume に分離してある
 * 	が，不要かもしれない．
 * 
 * 1999年8月 9日(月)
 */

package jp.ac.tohoku.is.archi.mpi2.dda;

import java.io.Serializable;

/**
 * ある空間の物体の存在の様子を示す
 * 	Geometry があるか， Volume があるか
 */
public final class ObjExistanceInASpc 
implements ObjInASpc 
, Serializable
{  
    public static final byte IS_GEO = 1; // = 01b :geometry(polygonなど)がある
    public static final byte IS_VOL = 2; // = 10b :volume がある

    private byte mObjInfo;

    /**
     * constructor
     */
    public ObjExistanceInASpc()
    {
	this.mObjInfo = 0;
    }
    /**
     * copy constructor
     */
    public ObjExistanceInASpc(ObjExistanceInASpc rhs)
    {
	this.mObjInfo = rhs.mObjInfo;
    }

    /**
     * set
     */
    public void set(int aGeoNum, int aVolNum) // set のみ消えない
    {
	if(aGeoNum > 0)
	{
	    this.mObjInfo |= (ObjExistanceInASpc.IS_GEO);
	}
	if(aVolNum > 0)
	{
	    this.mObjInfo |= ObjExistanceInASpc.IS_VOL;
	}
    }

    /**
     * clear : this space has no object.
     */
    public void clear()
    {
	this.mObjInfo = 0;
    }

    public boolean isObj() 	// 何か物体が存在すれば true
    {
	return((this.mObjInfo > 0) ? true : false);
    }

    public boolean isGeo() 	// geometry が存在すれば true
    {
	if((this.mObjInfo & ObjExistanceInASpc.IS_GEO) > 0)
	{
	    return(true);
	}else
	{
	    return(false);
	}
    }
    public boolean isVol() 	// volume が存在すれば true
    {
	if((this.mObjInfo & ObjExistanceInASpc.IS_VOL) > 0)
	{
	    return(true);
	}else
	{
	    return(false);
	}
    }

//      * for serialize (送信のために OBJINSPC_IMPLEMENT_TYPE で取り出す)
//     OBJINSPC_IMPLEMENT_TYPE getObjInfo() 
//     {
// 	return(this.mObjInfo);
//     }
    

    // for pretty print
    public String getVisualOutDescription() 
    {
	return(" [P]olygon, [V]olume, [B]oth");
    }

    public String toVisualString() 
    {
	// Polygon があれば P, Volume なら V, 両方なら B を返す
	if(this.mObjInfo == (ObjExistanceInASpc.IS_GEO | 
			     ObjExistanceInASpc.IS_VOL))
	{
	    return("B");
	}
	else if(this.mObjInfo == ObjExistanceInASpc.IS_GEO)
	{
	    return("P");
	}
	else if(this.mObjInfo == ObjExistanceInASpc.IS_VOL)	
	{
	    return("V");
	}
	else
	{
	    return(" ");	    	    
	}
    }
    
//      *----------------------------------------
//      * SerializableIF : double の表現が同じ計算機でないと上手くいかない    
//      *----------------------------------------
//     int getSerializedSize() 
//     {
// 	// OBJINSPC_IMPLEMENT_TYPE mObjInfo; 今は char 
// 	return(1);
//     }
//     double *newSerializedArray()
//     {
// 	double *r = new double[this.getSerializedSize()];
// 	r[0] = (double)(this.mObjInfo);
// 	return(r);
//     }
//     void deserialize(double *pBuf)
//     {
// 	this.mObjInfo = (char)(pBuf[0]);
//     }

    /**
     * equals
     */
    public boolean equals(Object obj)
    {
	if(obj instanceof ObjExistanceInASpc)
	{
	    ObjExistanceInASpc rhs = (ObjExistanceInASpc)obj;
	    return(this.mObjInfo == rhs.mObjInfo);
	}else
	{
	    return(false);
	}
    }
}
