You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
291 lines
6.6 KiB
291 lines
6.6 KiB
/* Swinder - Portable library for spreadsheet
|
|
Copyright (C) 2003 Ariya Hidayat <ariya@kde.org>
|
|
|
|
This library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Library General Public
|
|
License as published by the Free Software Foundation; either
|
|
version 2 of the License, or (at your option) any later version.
|
|
|
|
This library is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Library General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Library General Public License
|
|
along with this library; see the file COPYING.LIB. If not, write to
|
|
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
|
* Boston, MA 02110-1301, USA
|
|
*/
|
|
|
|
#ifndef SWINDER_VALUE_H
|
|
#define SWINDER_VALUE_H
|
|
|
|
#include <iostream>
|
|
#include "ustring.h"
|
|
|
|
namespace Swinder
|
|
{
|
|
|
|
class ValueData;
|
|
|
|
|
|
|
|
/**
|
|
* Provides a wrapper for cell value.
|
|
*
|
|
* Each cell in a worksheet must hold a value, either as enterred by user
|
|
* or as a result of formula evaluation. Default cell holds empty value.
|
|
*
|
|
* Value uses implicit data sharing to reduce memory usage.
|
|
*/
|
|
|
|
class Value
|
|
{
|
|
|
|
public:
|
|
|
|
typedef enum {
|
|
Empty,
|
|
Boolean,
|
|
Integer,
|
|
Float,
|
|
String,
|
|
CellRange, // not used yet
|
|
Array, // not used yet
|
|
Error
|
|
} Type;
|
|
|
|
/**
|
|
* Creates an empty value, i.e holds nothing.
|
|
*/
|
|
Value();
|
|
|
|
/**
|
|
* Creates a value of certain type.
|
|
*/
|
|
Value( Type _type );
|
|
|
|
/**
|
|
* Destroys the value.
|
|
*/
|
|
virtual ~Value();
|
|
|
|
/**
|
|
* Creates a copy from another value.
|
|
*/
|
|
Value( const Value& _value );
|
|
|
|
/**
|
|
* Assigns from another value.
|
|
*
|
|
* Because the data is implicitly shared, such assignment is very fast and
|
|
* doesn't consume additional memory.
|
|
*/
|
|
Value& operator= ( const Value& _value );
|
|
|
|
/**
|
|
* Assigns from another value. Same as above.
|
|
*/
|
|
Value& assign( const Value& _value );
|
|
|
|
/**
|
|
* Creates a boolean value.
|
|
*/
|
|
Value( bool b );
|
|
|
|
/**
|
|
* Creates an integer value.
|
|
*/
|
|
Value( int i );
|
|
|
|
/**
|
|
* Create a floating-point value.
|
|
*/
|
|
Value( double f );
|
|
|
|
/**
|
|
* Create a string value.
|
|
*/
|
|
Value( const UString& s );
|
|
|
|
/**
|
|
* Returns the type of the value.
|
|
*/
|
|
Type type() const;
|
|
|
|
/**
|
|
* Returns true if empty.
|
|
*/
|
|
bool isEmpty() const { return type() == Empty; }
|
|
|
|
/**
|
|
* Returns true if the type of this value is Boolean.
|
|
*/
|
|
bool isBoolean() const { return type() == Boolean; }
|
|
|
|
/**
|
|
* Returns true if the type of this value is integer.
|
|
*/
|
|
bool isInteger() const { return type() == Integer; }
|
|
|
|
/**
|
|
* Returns true if the type of this value is floating-point.
|
|
*/
|
|
bool isFloat() const { return type() == Float; }
|
|
|
|
/**
|
|
* Returns true if the type of this value is either
|
|
* integer or floating-point.
|
|
*/
|
|
bool isNumber() const { return (type() == Integer) || (type() == Float); }
|
|
|
|
/**
|
|
* Returns true if the type of this value is string.
|
|
*/
|
|
bool isString() const { return type() == String; }
|
|
|
|
/**
|
|
* Returns true if this value holds error information.
|
|
*/
|
|
bool isError() const { return type() == Error; }
|
|
|
|
void setValue( const Value& v );
|
|
|
|
/**
|
|
* Sets this value to boolean value.
|
|
*/
|
|
void setValue( bool b );
|
|
|
|
/**
|
|
* Sets this value to integer value.
|
|
*/
|
|
void setValue( int i );
|
|
|
|
/**
|
|
* Sets this value to floating-point value.
|
|
*/
|
|
void setValue( double f );
|
|
|
|
/**
|
|
* Sets this value to string value.
|
|
*/
|
|
void setValue( const UString& s );
|
|
|
|
/**
|
|
* Sets this value to hold error message.
|
|
*/
|
|
void setError( const UString& msg );
|
|
|
|
/**
|
|
* Returns the boolean value of this value.
|
|
*
|
|
* Call this function only if isBoolean() returns true.
|
|
*/
|
|
bool asBoolean() const;
|
|
|
|
/**
|
|
* Returns the integer value of this value.
|
|
*
|
|
* Call this function only if isNumber() returns true.
|
|
*/
|
|
int asInteger() const;
|
|
|
|
/**
|
|
* Returns the floating-point value of this value.
|
|
*
|
|
* Call this function only if isNumber() returns true.
|
|
*/
|
|
double asFloat() const;
|
|
|
|
/**
|
|
* Returns the string value of this value.
|
|
*
|
|
* Call this function only if isString() returns true.
|
|
*/
|
|
UString asString() const;
|
|
|
|
/**
|
|
* Returns error message associated with this value.
|
|
*
|
|
* Call this function only if isError() returns true.
|
|
*/
|
|
UString errorMessage() const;
|
|
|
|
/**
|
|
* Detaches itself from shared value data, i.e make a private, deep copy
|
|
* of the data. Usually this function is called automatically so you
|
|
* don't have to care about it.
|
|
*/
|
|
void detach();
|
|
|
|
/**
|
|
* Returns constant reference to empty value.
|
|
*/
|
|
static const Value& empty();
|
|
|
|
/**
|
|
* Returns constant reference to #DIV/0! error.
|
|
*
|
|
* This is used to indicate that a formula divides by 0 (zero).
|
|
*/
|
|
static const Value& errorDIV0();
|
|
|
|
/**
|
|
* Returns constant reference to #N/A error.
|
|
*
|
|
* This is to indicate that a value is not available to a function.
|
|
*/
|
|
static const Value& errorNA();
|
|
|
|
/**
|
|
* Returns constant reference to #NAME? error.
|
|
*
|
|
* This is to indicate that certain text inside formula is not
|
|
* recognized, possibly a misspelled name or name that
|
|
* does not exist.
|
|
*/
|
|
static const Value& errorNAME();
|
|
|
|
/**
|
|
* Returns constant reference to #NUM! error.
|
|
*
|
|
* This is to indicate a problem with a number in a formula.
|
|
*/
|
|
static const Value& errorNUM();
|
|
|
|
/**
|
|
* Returns constant reference to #NULL! error.
|
|
*
|
|
* This is to indicate that two area do not intersect.
|
|
*/
|
|
static const Value& errorNULL();
|
|
|
|
/**
|
|
* Returns constant reference to #REF! error.
|
|
*
|
|
* This is used to indicate an invalid cell reference.
|
|
*/
|
|
static const Value& errorREF();
|
|
|
|
/**
|
|
* Returns constant reference to #VALUE! error.
|
|
*
|
|
* This is to indicate that wrong type of argument or operand
|
|
* is used, usually within a function call, e.g SIN("some text").
|
|
*/
|
|
static const Value& errorVALUE();
|
|
|
|
protected:
|
|
|
|
ValueData* d; // can't never be 0
|
|
};
|
|
|
|
/**
|
|
* Dumps value to output stream, useful for debugging.
|
|
*/
|
|
std::ostream& operator<<( std::ostream& s, Value value );
|
|
|
|
} // namespace Swinder
|
|
|
|
#endif // SWINDER_VALUE_H
|