panda3d/pandatool/src/xfile/xFileArrayDef.cxx
2004-10-13 13:37:06 +00:00

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;
}