s32 UlamTypePrimitiveUnary::bitsizeToConvertTypeTo(ULAMTYPE tobUT) { s32 wordsize = getTotalWordSize(); s32 bitsize = getBitSize(); s32 tobitsize = UNKNOWNSIZE; switch(tobUT) { case Unsigned: tobitsize = (s32) _getLogBase2(bitsize) + 1; //fits into unsigned break; case Int: tobitsize = (s32) _getLogBase2(bitsize) + 1 + 1; break; case Bool: tobitsize = 1; break; case Unary: case Bits: tobitsize = bitsize; //self break; case Void: tobitsize = 0; break; case UAtom: case Class: break; default: m_state.abortUndefinedUlamType(); //std::cerr << "UlamTypePrimitiveUnary convertTypeTo error! " << tobUT << std::endl; }; return (tobitsize > wordsize ? wordsize : tobitsize); } //bitsizeToconvertTypeTo
FORECAST UlamTypeInt::safeCast(UTI typidx) { FORECAST scr = UlamType::safeCast(typidx); if(scr != CAST_CLEAR) return scr; bool brtn = true; UlamType * vut = m_state.getUlamTypeByIndex(typidx); s32 valbitsize = m_state.getBitSize(typidx); s32 bitsize = getBitSize(); ULAMTYPE valtypEnum = vut->getUlamTypeEnum(); switch(valtypEnum) { case Int: brtn = (bitsize >= valbitsize); break; case Unsigned: brtn = (bitsize > valbitsize); break; case Unary: brtn = (bitsize > (s32) _getLogBase2(valbitsize) + 1); break; case Bool: case Bits: case Void: case UAtom: brtn = false; break; case Class: { //must be Quark! treat as Int if it has a toInt method if(vut->isNumericType()) brtn = (bitsize >= MAXBITSPERINT); else { std::ostringstream msg; msg << "Class: "; msg << m_state.getUlamTypeNameBriefByIndex(typidx).c_str(); msg << " is not a numeric type and cannot be safely cast to an Int"; MSG(m_state.getFullLocationAsString(m_state.m_locOfNextLineText).c_str(),msg.str().c_str(), ERR); brtn = false; } } break; default: assert(0); //std::cerr << "UlamTypeInt (cast) error! Value Type was: " << valtypidx << std::endl; brtn = false; }; return brtn ? CAST_CLEAR : CAST_BAD; } //safeCast
FORECAST UlamTypePrimitiveInt::safeCast(UTI typidx) { FORECAST scr = UlamType::safeCast(typidx); if(scr != CAST_CLEAR) return scr; bool brtn = true; UlamType * vut = m_state.getUlamTypeByIndex(typidx); s32 valbitsize = m_state.getBitSize(typidx); s32 bitsize = getBitSize(); ULAMTYPE valtypEnum = vut->getUlamTypeEnum(); switch(valtypEnum) { case Int: brtn = (bitsize >= valbitsize); break; case Unsigned: brtn = (bitsize > valbitsize); break; case Unary: brtn = (bitsize > (s32) _getLogBase2(valbitsize) + 1); break; case Bool: case Bits: case Void: case UAtom: brtn = false; break; case Class: { //must be Quark! treat as Int if it has a toInt method if(vut->isNumericType()) brtn = (bitsize >= MAXBITSPERINT); else brtn = false; //t41131 called by matching args (no error msg please) } break; default: m_state.abortUndefinedUlamType(); //std::cerr << "UlamTypePrimitiveInt (cast) error! Value Type was: " << valtypidx << std::endl; brtn = false; }; return brtn ? CAST_CLEAR : CAST_BAD; } //safeCast