mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-04 19:08:55 -04:00
91 lines
3.1 KiB
C++
91 lines
3.1 KiB
C++
// Filename: xFileArrayDef.cxx
|
|
// Created by: drose (03Oct04)
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// PANDA 3D SOFTWARE
|
|
// Copyright (c) 2001 - 2004, Disney Enterprises, Inc. All rights reserved
|
|
//
|
|
// All use of this software is subject to the terms of the Panda 3d
|
|
// Software license. You should have received a copy of this license
|
|
// along with this source code; you will also find a current copy of
|
|
// the license at http://etc.cmu.edu/panda3d/docs/license/ .
|
|
//
|
|
// To contact the maintainers of this program write to
|
|
// panda3d-general@lists.sourceforge.net .
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
|
|
#include "xFileArrayDef.h"
|
|
#include "xFileDataDef.h"
|
|
#include "xFileDataObject.h"
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: XFileArrayDef::get_size
|
|
// Access: Public
|
|
// Description: Returns the size of the array dimension. If this is
|
|
// a fixed array, the size is trivial; if it is dynamic,
|
|
// the size is determined by looking up the dynamic_size
|
|
// element in the prev_data table (which lists all of
|
|
// the data values already defined at this scoping
|
|
// level).
|
|
////////////////////////////////////////////////////////////////////
|
|
int XFileArrayDef::
|
|
get_size(const XFileNode::PrevData &prev_data) const {
|
|
if (is_fixed_size()) {
|
|
return _fixed_size;
|
|
} else {
|
|
XFileNode::PrevData::const_iterator pi;
|
|
pi = prev_data.find(_dynamic_size);
|
|
nassertr_always(pi != prev_data.end(), 0);
|
|
nassertr((*pi).second != (XFileDataObject *)NULL, 0);
|
|
return (*pi).second->i();
|
|
}
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: XFileArrayDef::output
|
|
// Access: Public
|
|
// Description:
|
|
////////////////////////////////////////////////////////////////////
|
|
void XFileArrayDef::
|
|
output(ostream &out) const {
|
|
if (is_fixed_size()) {
|
|
out << "[" << _fixed_size << "]";
|
|
} else {
|
|
out << "[" << _dynamic_size->get_name() << "]";
|
|
}
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: XFileArrayDef::matches
|
|
// Access: Public, Virtual
|
|
// Description: Returns true if the node, particularly a template
|
|
// node, is structurally equivalent to the other node
|
|
// (which must be of the same type). This checks data
|
|
// element types, but does not compare data element
|
|
// names.
|
|
////////////////////////////////////////////////////////////////////
|
|
bool XFileArrayDef::
|
|
matches(const XFileArrayDef &other, const XFileDataDef *parent,
|
|
const XFileDataDef *other_parent) const {
|
|
if (other.is_fixed_size() != is_fixed_size()) {
|
|
return false;
|
|
}
|
|
if (is_fixed_size()) {
|
|
if (other.get_fixed_size() != get_fixed_size()) {
|
|
return false;
|
|
}
|
|
|
|
} else {
|
|
int child_index = parent->find_child_index(get_dynamic_size());
|
|
int other_child_index =
|
|
other_parent->find_child_index(other.get_dynamic_size());
|
|
if (other_child_index != child_index) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|