LoginSignup
0
0

More than 5 years have passed since last update.

適当Scala UByte

Last updated at Posted at 2013-07-06

メモです。

テストコード生成用のC言語プログラム


#include <stdio.h>

int main() {
  int i,j;
  int a[] = {0,1,2,3,126,127,128,129,253,254,255,256};
  for(i=0; i < sizeof(a)/sizeof(int); i++) {
    for(j=0; j < sizeof(a)/sizeof(int); j++) {
      printf("test(UByte(%d)<<UByte(%d)+\"\",\"%d\");\n",a[i],a[j],((unsigned char)a[i])<<((unsigned char)a[j]));
    }
  }
  return 0;
}

UByteを作ろうとしているメモPaseraからコピって来てて bsdライセンスなアレなので、一から作ったほうがいいのかもしれないです。

import scala.math.ScalaNumber
import scala.math.ScalaNumericConversions

//@serializable
case class UByte(byteValue:Byte) {
/*
  def toUByte = UByte(intRep.toByte)
  def toUShort = UShort(intRep.toShort)
  def toUInt = UInt(intRep)
  def toULong = ULong(intRep & 0xffffffffL)

  override def byteValue = intRep.toByte
  override def shortValue = intRep.toShort*/
  def intValue: Int = byteValue.asInstanceOf[Int]
/*  override def longValue = (intRep & 0xffffffffL)
  override def floatValue = (intRep & 0xffffffffL).toFloat
  override def doubleValue = (intRep & 0xffffffffL).toDouble

  def +(x: Int): Int = this.toInt + x
  def -(x: Int): Int = this.toInt - x
  def *(x: Int): Int = this.toInt * x
  def /(x: Int): Int = this.toInt / x
  def %(x: Int): Int = this.toInt % x
  def &(x: Int): Int = this.toInt & x
  def |(x: Int): Int = this.toInt | x
  def ^(x: Int): Int = this.toInt ^ x

  def +(x: Long): Long = this.toLong + x
  def -(x: Long): Long = this.toLong - x
  def *(x: Long): Long = this.toLong * x
  def /(x: Long): Long = this.toLong / x
  def %(x: Long): Long = this.toLong % x
  def &(x: Long): Long = this.toLong & x
  def |(x: Long): Long = this.toLong | x
  def ^(x: Long): Long = this.toLong ^ x
*/
  def +(x: UByte): Int = ((byteValue & 255) + (x.byteValue & 255))
  def -(x: UByte): Int = ((byteValue & 255) - (x.byteValue & 255))
  def *(x: UByte): Int = ((byteValue & 255) * (x.byteValue & 255))
  def /(x: UByte): Int = ((byteValue & 255) / (x.byteValue & 255))
  def %(x: UByte): Int = ((byteValue & 255) % (x.byteValue & 255))
  def &(x: UByte): Int = ((byteValue & 255) & (x.byteValue & 255))
  def |(x: UByte): Int = ((byteValue & 255) | (x.byteValue & 255))
  def ^(x: UByte): Int = ((byteValue & 255) ^ (x.byteValue & 255))
  def <(x: UByte): Boolean = ((byteValue & 255) < (x.byteValue & 255))
  def >(x: UByte): Boolean = ((byteValue & 255) > (x.byteValue & 255))
  def <=(x: UByte): Boolean = ((byteValue & 255) <= (x.byteValue & 255))
  def >=(x: UByte): Boolean = ((byteValue & 255) >= (x.byteValue & 255))
  /*

  def +(x: UShort): UInt = this + x.toUInt
  def -(x: UShort): UInt = this - x.toUInt
  def *(x: UShort): UInt = this * x.toUInt
  def /(x: UShort): UInt = this / x.toUInt
  def %(x: UShort): UInt = this % x.toUInt
  def &(x: UShort): UInt = this & x.toUInt
  def |(x: UShort): UInt = this | x.toUInt
  def ^(x: UShort): UInt = this ^ x.toUInt
  def <(x: UShort): Boolean = this < x.toUInt
  def >(x: UShort): Boolean = this > x.toUInt
  def <=(x: UShort): Boolean = this <= x.toUInt
  def >=(x: UShort): Boolean = this >= x.toUInt

  def +(x: ULong): ULong = this.toULong + x
  def -(x: ULong): ULong = this.toULong - x
  def *(x: ULong): ULong = this.toULong * x
  def /(x: ULong): ULong = this.toULong / x
  def %(x: ULong): ULong = this.toULong % x
  def &(x: ULong): ULong = this.toULong & x
  def |(x: ULong): ULong = this.toULong | x
  def ^(x: ULong): ULong = this.toULong ^ x
  def <(x: ULong): Boolean = this.toULong < x
  def >(x: ULong): Boolean = this.toULong > x
  def <=(x: ULong): Boolean = this.toULong <= x
  def >=(x: ULong): Boolean = this.toULong >= x

  def +(x: UInt) = UInt(intRep + x.intRep)
  def -(x: UInt) = UInt(intRep - x.intRep)
  def *(x: UInt) = UInt(intRep * x.intRep)

  def /(x: UInt) = {
    val n = intRep & 0xffffffffL
    val m = x.intRep & 0xffffffffL
    val r = n / m
    UInt(r.toInt)
  }

  def %(x: UInt) = {
    val n = intRep & 0xffffffffL
    val m = x.intRep & 0xffffffffL
    val r = n % m
    UInt(r.toInt)
  }

  def unary_+ = this.toUInt
  def unary_- = UInt(-intRep)

  // Equality comparison to UInt is baked in

  // Override equals to allow comparison with other number types.
  // By overriding ScalaNumber, we can cause UInt.equals to be invoked when
  // comparing a number on the left with a UInt on the right.
  // This is an (undocumented?) hack and might change in the future.
  override def equals(x: Any) = x match {
    case x: SmallUInt[_] => this.toInt == x.intRep
    case x: ULong => this.toULong == x
    case x: Number => this.longValue == x.longValue && x.longValue >= 0
    case _ => false
  }
  def canEqual(x: Any) = x match {
    case _: SmallUInt[_] => true
    case _: ULong => true
    case _: Number => true
    case _ => false
  }

  private def rot(x: Int) = (x + Int.MinValue)

  def <(x: UInt) = rot(intRep) < rot(x.intRep)
  def >(x: UInt) = rot(intRep) > rot(x.intRep)
  def <=(x: UInt) = rot(intRep) <= rot(x.intRep)
  def >=(x: UInt) = rot(intRep) >= rot(x.intRep)

  def &(x : UInt) = UInt(intRep & x.intRep)
  def |(x : UInt) = UInt(intRep | x.intRep)
  def ^(x : UInt) = UInt(intRep ^ x.intRep)

  def unary_~ = UInt(~intRep)
*/
  def <<(x : Int) = UByte(byteValue << x)
  def <<(x : Long) = UByte(byteValue << x)
//  def <<(x : UInt) = UByte(byteValue << (x.toInt & 0x1f))
//  def <<(x : ULong) = UByte(byteValue << (x.toLong & 0x1f))

  def >>(x : Long) = UByte((byteValue & 255) >> x)
  def >>(x : Int) = UByte((byteValue & 255) >> x)
//  def >>(x : UInt) = UByte(byteValue >>> (x.toInt & 0x1f))
//  def >>(x : ULong) = UByte(byteValue >>> (x.toLong & 0x1f))

  def >>>(x : Int) = UByte(byteValue >>> x)
  def >>>(x : Long) = UByte(byteValue >>> x)
//  def >>>(x : UInt) = UByte(byteValue >>> (x.toInt & 0x1f))
//  def >>>(x : ULong) = UByte(byteValue >>> (x.toLong & 0x1f))

  override def toString = (byteValue & 0xff).toString
/*
  def +(x : java.lang.String) = this.toString + x

  def toHexString = (intRep & 0xffffffffL).toHexString
  def toOctalString = (intRep & 0xffffffffL).toOctalString
  def toBinaryString = (intRep & 0xffffffffL).toBinaryString
*/
}

object UByte {
  def apply(a:Int):UByte = UByte(a.asInstanceOf[Byte])
}

object t {
  implicit def int2ubyte(x: Int) = UByte(x)
  def test(b:String,s:String) {
    if (b != s) throw new Exception("test error")
  }
  def main(args:Array[String]) {
    test(UByte(0)+UByte(0)+"","0");
    test(UByte(0)+UByte(1)+"","1");
    test(UByte(0)+UByte(2)+"","2");
    test(UByte(0)+UByte(3)+"","3");
    test(UByte(0)+UByte(126)+"","126");
    test(UByte(0)+UByte(127)+"","127");
    test(UByte(0)+UByte(128)+"","128");
    test(UByte(0)+UByte(129)+"","129");
    test(UByte(0)+UByte(253)+"","253");
    test(UByte(0)+UByte(254)+"","254");
    test(UByte(0)+UByte(255)+"","255");
    test(UByte(0)+UByte(256)+"","0");
    test(UByte(1)+UByte(0)+"","1");
    test(UByte(1)+UByte(1)+"","2");
    test(UByte(1)+UByte(2)+"","3");
    test(UByte(1)+UByte(3)+"","4");
    test(UByte(1)+UByte(126)+"","127");
    test(UByte(1)+UByte(127)+"","128");
    test(UByte(1)+UByte(128)+"","129");
    test(UByte(1)+UByte(129)+"","130");
    test(UByte(1)+UByte(253)+"","254");
    test(UByte(1)+UByte(254)+"","255");
    test(UByte(1)+UByte(255)+"","256");
    test(UByte(1)+UByte(256)+"","1");
    test(UByte(2)+UByte(0)+"","2");
    test(UByte(2)+UByte(1)+"","3");
    test(UByte(2)+UByte(2)+"","4");
    test(UByte(2)+UByte(3)+"","5");
    test(UByte(2)+UByte(126)+"","128");
    test(UByte(2)+UByte(127)+"","129");
    test(UByte(2)+UByte(128)+"","130");
    test(UByte(2)+UByte(129)+"","131");
    test(UByte(2)+UByte(253)+"","255");
    test(UByte(2)+UByte(254)+"","256");
    test(UByte(2)+UByte(255)+"","257");
    test(UByte(2)+UByte(256)+"","2");
    test(UByte(3)+UByte(0)+"","3");
    test(UByte(3)+UByte(1)+"","4");
    test(UByte(3)+UByte(2)+"","5");
    test(UByte(3)+UByte(3)+"","6");
    test(UByte(3)+UByte(126)+"","129");
    test(UByte(3)+UByte(127)+"","130");
    test(UByte(3)+UByte(128)+"","131");
    test(UByte(3)+UByte(129)+"","132");
    test(UByte(3)+UByte(253)+"","256");
    test(UByte(3)+UByte(254)+"","257");
    test(UByte(3)+UByte(255)+"","258");
    test(UByte(3)+UByte(256)+"","3");
    test(UByte(126)+UByte(0)+"","126");
    test(UByte(126)+UByte(1)+"","127");
    test(UByte(126)+UByte(2)+"","128");
    test(UByte(126)+UByte(3)+"","129");
    test(UByte(126)+UByte(126)+"","252");
    test(UByte(126)+UByte(127)+"","253");
    test(UByte(126)+UByte(128)+"","254");
    test(UByte(126)+UByte(129)+"","255");
    test(UByte(126)+UByte(253)+"","379");
    test(UByte(126)+UByte(254)+"","380");
    test(UByte(126)+UByte(255)+"","381");
    test(UByte(126)+UByte(256)+"","126");
    test(UByte(127)+UByte(0)+"","127");
    test(UByte(127)+UByte(1)+"","128");
    test(UByte(127)+UByte(2)+"","129");
    test(UByte(127)+UByte(3)+"","130");
    test(UByte(127)+UByte(126)+"","253");
    test(UByte(127)+UByte(127)+"","254");
    test(UByte(127)+UByte(128)+"","255");
    test(UByte(127)+UByte(129)+"","256");
    test(UByte(127)+UByte(253)+"","380");
    test(UByte(127)+UByte(254)+"","381");
    test(UByte(127)+UByte(255)+"","382");
    test(UByte(127)+UByte(256)+"","127");
    test(UByte(128)+UByte(0)+"","128");
    test(UByte(128)+UByte(1)+"","129");
    test(UByte(128)+UByte(2)+"","130");
    test(UByte(128)+UByte(3)+"","131");
    test(UByte(128)+UByte(126)+"","254");
    test(UByte(128)+UByte(127)+"","255");
    test(UByte(128)+UByte(128)+"","256");
    test(UByte(128)+UByte(129)+"","257");
    test(UByte(128)+UByte(253)+"","381");
    test(UByte(128)+UByte(254)+"","382");
    test(UByte(128)+UByte(255)+"","383");
    test(UByte(128)+UByte(256)+"","128");
    test(UByte(129)+UByte(0)+"","129");
    test(UByte(129)+UByte(1)+"","130");
    test(UByte(129)+UByte(2)+"","131");
    test(UByte(129)+UByte(3)+"","132");
    test(UByte(129)+UByte(126)+"","255");
    test(UByte(129)+UByte(127)+"","256");
    test(UByte(129)+UByte(128)+"","257");
    test(UByte(129)+UByte(129)+"","258");
    test(UByte(129)+UByte(253)+"","382");
    test(UByte(129)+UByte(254)+"","383");
    test(UByte(129)+UByte(255)+"","384");
    test(UByte(129)+UByte(256)+"","129");
    test(UByte(253)+UByte(0)+"","253");
    test(UByte(253)+UByte(1)+"","254");
    test(UByte(253)+UByte(2)+"","255");
    test(UByte(253)+UByte(3)+"","256");
    test(UByte(253)+UByte(126)+"","379");
    test(UByte(253)+UByte(127)+"","380");
    test(UByte(253)+UByte(128)+"","381");
    test(UByte(253)+UByte(129)+"","382");
    test(UByte(253)+UByte(253)+"","506");
    test(UByte(253)+UByte(254)+"","507");
    test(UByte(253)+UByte(255)+"","508");
    test(UByte(253)+UByte(256)+"","253");
    test(UByte(254)+UByte(0)+"","254");
    test(UByte(254)+UByte(1)+"","255");
    test(UByte(254)+UByte(2)+"","256");
    test(UByte(254)+UByte(3)+"","257");
    test(UByte(254)+UByte(126)+"","380");
    test(UByte(254)+UByte(127)+"","381");
    test(UByte(254)+UByte(128)+"","382");
    test(UByte(254)+UByte(129)+"","383");
    test(UByte(254)+UByte(253)+"","507");
    test(UByte(254)+UByte(254)+"","508");
    test(UByte(254)+UByte(255)+"","509");
    test(UByte(254)+UByte(256)+"","254");
    test(UByte(255)+UByte(0)+"","255");
    test(UByte(255)+UByte(1)+"","256");
    test(UByte(255)+UByte(2)+"","257");
    test(UByte(255)+UByte(3)+"","258");
    test(UByte(255)+UByte(126)+"","381");
    test(UByte(255)+UByte(127)+"","382");
    test(UByte(255)+UByte(128)+"","383");
    test(UByte(255)+UByte(129)+"","384");
    test(UByte(255)+UByte(253)+"","508");
    test(UByte(255)+UByte(254)+"","509");
    test(UByte(255)+UByte(255)+"","510");
    test(UByte(255)+UByte(256)+"","255");
    test(UByte(256)+UByte(0)+"","0");
    test(UByte(256)+UByte(1)+"","1");
    test(UByte(256)+UByte(2)+"","2");
    test(UByte(256)+UByte(3)+"","3");
    test(UByte(256)+UByte(126)+"","126");
    test(UByte(256)+UByte(127)+"","127");
    test(UByte(256)+UByte(128)+"","128");
    test(UByte(256)+UByte(129)+"","129");
    test(UByte(256)+UByte(253)+"","253");
    test(UByte(256)+UByte(254)+"","254");
    test(UByte(256)+UByte(255)+"","255");
    test(UByte(256)+UByte(256)+"","0");
  }
}
0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0