// $Id: constants.idl 83901 2008-11-28 11:29:31Z johnnyw $

// ============================================================================
//
// = LIBRARY
//    TAO/tests/IDL_Test
//
// = FILENAME
//    constants.idl
//
// = DESCRIPTION
//    This file contains examples of IDL code that has
//    caused problems in the past for the TAO IDL
//    compiler. This test is to make sure the problems
//    stay fixed.
//
// = AUTHORS
//    Jeff Parsons <parsons@cs.wustl.edu> and TAO users.
//
// ============================================================================


const string all_escape = "\n\t\v\b\r\f\a\\\?\'\"";

const char tick = '\'';

const char backslash = '\\';

// The escape sequences will display differently
// depending on whether the platform uses signed
// or unsigned chars, but either should build w/o
// errors.

// octal escape sequences

const char oct_nought = '\000';
const char lucky = '\7';
const char square = '4';
const char blastoff = '\321';
const char max_char_oct = '\377';

// hex escape sequences

const char hex_nought ='\x0';
const char fingers = '\xA';
const char fortnight = '\xe';
const char fivebits = '\x32';
const char maybe_minus = '\xAf';
const char max_char_hex = '\xff';

// const wstring wstr = L"wstr";

// unsigned longs greater than LONG_MAX

const unsigned long in_range = 3222111000;
const unsigned long max_ulong_oct = 037777777777;
const unsigned long max_ulong_hex = 0XFFFFFFFF;

// various uncommon but legal formats for floats and doubles

const float root_beer = .2;
const double bogey = .2;
const float trip = 2.;
const double vision = .2e-4;
const double take = 2e3;
const double dip = 1.797693134862315E+308;
const double trouble = 2.2250738585072014E-308;

// const values created through mathematic operations
const long neg = -8;
const long sub1 = 0x10 - 0x01;
const long sub2 = 0x10 + (-0x01);
const unsigned long add1 = 16 + 1;
const unsigned long mul1 = 0x80 * 0x70;
const unsigned long div1 = 99 / 12;

// The original Sun code for bitwise operators was broken.

const unsigned short stuff = ~0;
const unsigned long day = ~0;
const unsigned long drink = 1000000000 << 2;
const unsigned long c_l1 = (1 << 1);
const octet c_o11 = 10 + c_l1;
// @@ (JP 06/03/07) Seems it is still broken for big-endian systems,
// at least. Rather than hold up a beta release with a redesign...
//const octet c_o3 = (1 << 3);

// An enum of one type cannot be assigned to an constant of another
// enum type, but it's ok if one is a typedef of the other.
module m_a
{
   enum enum_a { value_1, value_2, value_3, value_4, value_5 };
};

module m_b
{
   typedef m_a::enum_a enum_b;
};

module problems
{
   const m_b::enum_b bconst = m_a::value_2;
};

// In a class, string constants cannot be declared inline, but
// arithmetic types can be.
module ClassConstants
{
  interface Iface
  {
    const long iface_long = 55;
    const string iface_str = "iface_str";
//    const wstring iface_wstr = L"iface_wstr";
  };

  valuetype Vt
  {
    const double vt_long = 66.66;
    const string vt_str = "vt_str";
//    const wstring vt_wstr = L"vt_wstr";
  };
};

// The bitwise OR rhs was causing bogus coercion failure.
module CoercionBug
{
  typedef unsigned short UInt16;
  typedef UInt16 CellFlags;

  const CellFlags EXPLICIT_VALUE_LOCK = 0x0400;
  const CellFlags EDIT_VALUE_LOCK = 0x1000;

  const CellFlags VALUE_LOCK = (EXPLICIT_VALUE_LOCK | EDIT_VALUE_LOCK);
};

module SignedGen
{
  // On some platforms, the rhs of a typedef'd long constant is
  // getting generated as an unsigned literal.
  typedef long LongType;
  const LongType val = -3;
  typedef short ShortType;
  const ShortType short_val = -3;
};
