/* $Id$
 *
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements. See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to you under the Apache License, Version
 * 2.0 (the "License"); you may not use this file except in compliance
 * with the License. You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef __ETCHNUMBER_H__
#define __ETCHNUMBER_H__

#include "common/EtchObject.h"
#include "common/EtchObjectType.h"

class EtchNumber :
public EtchObject {

public:

  /**
   * EtchObjectType for EtchLong.
   */
  static const EtchObjectType* TYPE() {
    const static EtchObjectType TYPE(EOTID_NUMBER, NULL);
    return &TYPE;
  }

  /**
   * Constructor
   */
  EtchNumber() {
    addObjectType(TYPE());
  }

  /**
   * returns the value as a long
   * @return int64 value
   */
  virtual capu::int64_t getLongValue() const = 0;

  /**
   * returns the value as an int32
   * @return int32 value
   */
  virtual capu::int32_t getInt32Value() const = 0;

  /**
   * returns the value as a short
   * @return int16 value
   */
  virtual capu::int16_t getShortValue() const = 0;

  /**
   * returns the value as a byte
   * @return int8 value
   */
  virtual capu::int8_t getByteValue() const = 0;

};

typedef capu::SmartPointer<EtchNumber> EtchNumberPtr;

#endif
