mbeckerle commented on a change in pull request #264: WIP - DAFFODIL-2169
URL: https://github.com/apache/incubator-daffodil/pull/264#discussion_r306832787
 
 

 ##########
 File path: daffodil-lib/src/main/scala/org/apache/daffodil/util/DataValue.scala
 ##########
 @@ -0,0 +1,91 @@
+package org.apache.daffodil.infoset
+
+import java.lang.{ Boolean => JBoolean, Number => JNumber, Long => JLong, 
Double => JDouble, String => JString, Float => JFloat, Byte => JByte, Integer 
=> JInt, Short => JShort }
+import java.math.{ BigDecimal => JBigDecimal, BigInteger => JBigInt }
+import org.apache.daffodil.calendar.DFDLCalendar
+
+/*
+ * DINode is not visible to Daffodil-lib, so we cannot actually reference this 
here.
+ * We are trusting the rest of the codebase to only apply DataValueDINode to 
the DINode
+ * class.
+ * The DINode class itself defines an implicit DataValueDINode -> DINode 
conversion
+ */
+trait DataValueDINodeTrait extends NonNullable;
+
+trait NonNullable;
+trait Nullable extends NonNullable;
+sealed trait DataValuePrimitiveType
+
+final class DataValue[+T <: AnyRef, +X<:AnyRef] private (val v: T) extends 
AnyVal {
+  def isEmpty = DataValue.NoValue.v eq v
+  def isDefined = !isEmpty
+  def value = v
+  override def toString = if (isEmpty) "NoValue" else "DataValue("+ v.toString 
+")"
+  
+  def getAnyRef = v.asInstanceOf[AnyRef]
+  def getBigDecimal = v.asInstanceOf[JBigDecimal]
+  def getCalendar = v.asInstanceOf[DFDLCalendar]
+  def getByteArray = v.asInstanceOf[Array[Byte]]
+  def getBoolean = v.asInstanceOf[JBoolean]
+  def getNumber = v.asInstanceOf[JNumber]
+  def getLong = v.asInstanceOf[JLong]
+  def getDouble = v.asInstanceOf[JDouble]
+  def getBigInt = v.asInstanceOf[JBigInt]
+  def getString = v.asInstanceOf[JString]
+}
+
+
+object DataValue {
+  type DataValueAny = DataValue[AnyRef, Nullable]
+  type DataValueNonEmpty = DataValue[AnyRef, NonNullable]
+  type DataValuePrimitive = DataValue[AnyRef, DataValuePrimitiveType]
+  
+  type DataValueEmpty = DataValue[NoValueObj, Nullable with 
DataValuePrimitiveType]
+  type DataValueBigDecimal = DataValue[JBigDecimal, NonNullable with 
DataValuePrimitiveType]
+  type DataValueCalendar = DataValue[DFDLCalendar, NonNullable with 
DataValuePrimitiveType]
+  type DataValueByteArray = DataValue[Array[Byte], NonNullable with 
DataValuePrimitiveType]
+  type DataValueBool = DataValue[JBoolean, NonNullable with 
DataValuePrimitiveType]
+  type DataValueNumber = DataValue[JNumber, NonNullable with 
DataValuePrimitiveType]  
+  type DataValueLong = DataValue[JLong, NonNullable with 
DataValuePrimitiveType]  
+  type DataValueDouble = DataValue[JDouble, NonNullable with 
DataValuePrimitiveType]  
+  type DataValueBigInt = DataValue[JBigInt, NonNullable with 
DataValuePrimitiveType] 
+  type DataValueString = DataValue[JString, NonNullable with 
DataValuePrimitiveType] 
+  type DataValueFloat = DataValue[JFloat, NonNullable with 
DataValuePrimitiveType]
+  type DataValueByte = DataValue[JByte, NonNullable with 
DataValuePrimitiveType]
+  type DataValueInt = DataValue[JInt, NonNullable with DataValuePrimitiveType]
+  type DataValueShort = DataValue[JShort, NonNullable with 
DataValuePrimitiveType]
+  type DataValueDINode = DataValue[DataValueDINodeTrait, NonNullable with 
DataValuePrimitiveType]
+
+  import scala.language.implicitConversions
+    
+  implicit def toDataValue(v: JBigDecimal): DataValueBigDecimal = new 
DataValue(v)
+  implicit def toDataValue(v: DFDLCalendar) : DataValueCalendar = new 
DataValue(v)
+  implicit def toDataValue(v: Array[Byte]) : DataValueByteArray = new 
DataValue(v)
+  implicit def toDataValue(v: JBoolean) : DataValueBool = new DataValue(v)
+  implicit def toDataValue(v: JNumber) : DataValueNumber = new DataValue(v)
+  implicit def toDataValue(v: JLong) : DataValueLong = new DataValue(v)
+  implicit def toDataValue(v: JDouble) : DataValueDouble = new DataValue(v)
+  implicit def toDataValue(v: JBigInt) : DataValueBigInt = new DataValue(v)
+  implicit def toDataValue(v: JString) : DataValueString = new DataValue(v)
+  implicit def toDataValue(v: JFloat) : DataValueFloat = new DataValue(v)
+  implicit def toDataValue(v: JByte) : DataValueByte = new DataValue(v)
+  implicit def toDataValue(v: JInt) : DataValueInt = new DataValue(v)
+  implicit def toDataValue(v: JShort) : DataValueShort = new DataValue(v)
+  implicit def toDataValue(v: DataValueDINodeTrait) : DataValueDINode = new 
DataValue(v)
+  
+  
+  implicit def toDataValue(v: Long) : DataValueLong = new DataValue(v:JLong)
+  implicit def toDataValue(v: Double) : DataValueDouble = new 
DataValue(v:JDouble)
+  implicit def toDataValue(v: Boolean) : DataValueBool = new 
DataValue(v:JBoolean)
+  implicit def toDataValue(v: Float) : DataValueFloat = new DataValue(v:JFloat)
+  implicit def toDataValue(v: Byte) : DataValueByte = new DataValue(v:JByte)
+  implicit def toDataValue(v: Int) : DataValueInt = new DataValue(v:JInt)
+  implicit def toDataValue(v: Short) : DataValueShort = new DataValue(v:JShort)
+
+  val NoValue = new DataValue(new NoValueObj)
+
+}
+
+protected class NoValueObj {
 
 Review comment:
   If this is just a singleton, why not an object. Any why not make it  a 
private member of the DataValue object?

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
[email protected]


With regards,
Apache Git Services

Reply via email to