232 lines
6.2 KiB
Text
232 lines
6.2 KiB
Text
/**
|
|
* PANDA 3D SOFTWARE
|
|
* Copyright (c) Carnegie Mellon University. All rights reserved.
|
|
*
|
|
* All use of this software is subject to the terms of the revised BSD
|
|
* license. You should have received a copy of this license along
|
|
* with this source code in a file named "LICENSE."
|
|
*
|
|
* @file configDeclaration.I
|
|
* @author drose
|
|
* @date 2004-10-15
|
|
*/
|
|
|
|
/**
|
|
* Sorts two declarations in order based on the order in which their
|
|
* respective pages were loaded, and the order in which they appear within the
|
|
* same page.
|
|
*/
|
|
INLINE bool ConfigDeclaration::
|
|
operator < (const ConfigDeclaration &other) const {
|
|
if (get_page() == other.get_page()) {
|
|
// On the same page, we compare based on the decl_seq.
|
|
return get_decl_seq() < other.get_decl_seq();
|
|
}
|
|
|
|
// On different pages, we compare based on the page importance.
|
|
return *get_page() < *other.get_page();
|
|
}
|
|
|
|
/**
|
|
* Returns the page on which this declaration can be found.
|
|
*/
|
|
INLINE ConfigPage *ConfigDeclaration::
|
|
get_page() const {
|
|
return _page;
|
|
}
|
|
|
|
/**
|
|
* Returns the variable that this declaration names. This variable may or may
|
|
* not have been defined by the time the declaration is read.
|
|
*/
|
|
INLINE ConfigVariableCore *ConfigDeclaration::
|
|
get_variable() const {
|
|
return _variable;
|
|
}
|
|
|
|
/**
|
|
* Returns the value assigned to this variable. This is the original one-line
|
|
* text defined for the variable in the .prc file (or passed to
|
|
* ConfigPage::make_declaration()).
|
|
*/
|
|
INLINE const std::string &ConfigDeclaration::
|
|
get_string_value() const {
|
|
return _string_value;
|
|
}
|
|
|
|
/**
|
|
* Changes the value assigned to this variable.
|
|
*/
|
|
INLINE void ConfigDeclaration::
|
|
set_string_value(const std::string &string_value) {
|
|
_string_value = string_value;
|
|
_got_words = false;
|
|
invalidate_cache();
|
|
}
|
|
|
|
/**
|
|
* Returns the number of words in the declaration's value. A word is defined
|
|
* as a sequence of non-whitespace characters delimited by whitespace.
|
|
*/
|
|
INLINE size_t ConfigDeclaration::
|
|
get_num_words() const {
|
|
if (!_got_words) {
|
|
((ConfigDeclaration *)this)->get_words();
|
|
}
|
|
return _words.size();
|
|
}
|
|
|
|
/**
|
|
* Returns true if the declaration's value has a valid string value for the
|
|
* nth word. This is really the same thing as asking if there are at least n
|
|
* words in the value.
|
|
*/
|
|
INLINE bool ConfigDeclaration::
|
|
has_string_word(size_t n) const {
|
|
if (!_got_words) {
|
|
((ConfigDeclaration *)this)->get_words();
|
|
}
|
|
return (n < _words.size());
|
|
}
|
|
|
|
/**
|
|
* Returns true if the declaration's value has a valid boolean value for the
|
|
* nth word.
|
|
*/
|
|
INLINE bool ConfigDeclaration::
|
|
has_bool_word(size_t n) const {
|
|
if (has_string_word(n)) {
|
|
((ConfigDeclaration *)this)->check_bool_word(n);
|
|
return (_words[n]._flags & F_valid_bool) != 0;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Returns true if the declaration's value has a valid integer value for the
|
|
* nth word.
|
|
*/
|
|
INLINE bool ConfigDeclaration::
|
|
has_int_word(size_t n) const {
|
|
if (has_string_word(n)) {
|
|
((ConfigDeclaration *)this)->check_int_word(n);
|
|
return (_words[n]._flags & F_valid_int) != 0;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Returns true if the declaration's value has a valid int64 value for the nth
|
|
* word.
|
|
*/
|
|
INLINE bool ConfigDeclaration::
|
|
has_int64_word(size_t n) const {
|
|
if (has_string_word(n)) {
|
|
((ConfigDeclaration *)this)->check_int64_word(n);
|
|
return (_words[n]._flags & F_valid_int64) != 0;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Returns true if the declaration's value has a valid integer value for the
|
|
* nth word.
|
|
*/
|
|
INLINE bool ConfigDeclaration::
|
|
has_double_word(size_t n) const {
|
|
if (has_string_word(n)) {
|
|
((ConfigDeclaration *)this)->check_double_word(n);
|
|
return (_words[n]._flags & F_valid_double) != 0;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Returns the string value of the nth word of the declaration's value, or
|
|
* empty string if there is no nth value. See also has_string_word().
|
|
*/
|
|
INLINE std::string ConfigDeclaration::
|
|
get_string_word(size_t n) const {
|
|
if (has_string_word(n)) {
|
|
return _words[n]._str;
|
|
}
|
|
return std::string();
|
|
}
|
|
|
|
/**
|
|
* Returns the boolean value of the nth word of the declaration's value, or
|
|
* false if there is no nth value. See also has_bool_word().
|
|
*/
|
|
INLINE bool ConfigDeclaration::
|
|
get_bool_word(size_t n) const {
|
|
// We use has_string_word() instead of has_bool_word(), so we can return a
|
|
// partial answer if there was one.
|
|
if (has_string_word(n)) {
|
|
((ConfigDeclaration *)this)->check_bool_word(n);
|
|
return _words[n]._bool;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Returns the integer value of the nth word of the declaration's value, or 0
|
|
* if there is no nth value. See also has_int_word().
|
|
*/
|
|
INLINE int ConfigDeclaration::
|
|
get_int_word(size_t n) const {
|
|
// We use has_string_word() instead of has_int_word(), so we can return a
|
|
// partial answer if there was one.
|
|
if (has_string_word(n)) {
|
|
((ConfigDeclaration *)this)->check_int_word(n);
|
|
return _words[n]._int;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Returns the int64 value of the nth word of the declaration's value, or 0 if
|
|
* there is no nth value. See also has_int64_word().
|
|
*/
|
|
INLINE int64_t ConfigDeclaration::
|
|
get_int64_word(size_t n) const {
|
|
// We use has_string_word() instead of has_int64_word(), so we can return a
|
|
// partial answer if there was one.
|
|
if (has_string_word(n)) {
|
|
((ConfigDeclaration *)this)->check_int64_word(n);
|
|
return _words[n]._int_64;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Returns the integer value of the nth word of the declaration's value, or 0
|
|
* if there is no nth value. See also has_double_word().
|
|
*/
|
|
INLINE double ConfigDeclaration::
|
|
get_double_word(size_t n) const {
|
|
// We use has_string_word() instead of has_double_word(), so we can return a
|
|
// partial answer if there was one.
|
|
if (has_string_word(n)) {
|
|
((ConfigDeclaration *)this)->check_double_word(n);
|
|
return _words[n]._double;
|
|
}
|
|
return 0.0;
|
|
}
|
|
|
|
|
|
/**
|
|
* Returns the sequence number of the declaration within the page. Sequence
|
|
* numbers are assigned as each declaration is created; each declaration is
|
|
* given a higher sequence number than all the declarations created in the
|
|
* page before it.
|
|
*/
|
|
INLINE int ConfigDeclaration::
|
|
get_decl_seq() const {
|
|
return _decl_seq;
|
|
}
|
|
|
|
INLINE std::ostream &
|
|
operator << (std::ostream &out, const ConfigDeclaration &decl) {
|
|
decl.output(out);
|
|
return out;
|
|
}
|