historical/toontown-classic.git/panda/include/bamCacheRecord.I
2024-01-16 11:20:27 -06:00

198 lines
5.6 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 bamCacheRecord.I
* @author drose
* @date 2006-06-09
*/
/**
* Returns a duplicate of the BamCacheRecord. The duplicate will not have a
* data pointer set, even though one may have been assigned to the original
* via set_data().
*/
INLINE PT(BamCacheRecord) BamCacheRecord::
make_copy() const {
return new BamCacheRecord(*this);
}
/**
* Returns true if the record matches the other record in those attributes
* which get written to disk. Does not compare the data pointer.
*/
INLINE bool BamCacheRecord::
operator == (const BamCacheRecord &other) const {
return (_source_pathname == other._source_pathname &&
_cache_filename == other._cache_filename &&
_recorded_time == other._recorded_time &&
_record_size == other._record_size);
}
/**
* Returns the full pathname to the source file that originally generated this
* cache request. In some cases, for instance in the case of a of a multipage
* texture like "cube_#.png", this may not not a true filename on disk.
*/
INLINE const Filename &BamCacheRecord::
get_source_pathname() const {
return _source_pathname;
}
/**
* Returns the name of the cache file as hashed from the source_pathname.
* This will be relative to the root of the cache directory, and it will not
* include any suffixes that may be appended to resolve hash conflicts.
*/
INLINE const Filename &BamCacheRecord::
get_cache_filename() const {
return _cache_filename;
}
/**
* Returns the file timestamp of the original source file that generated this
* cache record, if available. In some cases the original file timestamp is
* not available, and this will return 0.
*/
INLINE time_t BamCacheRecord::
get_source_timestamp() const {
return _source_timestamp;
}
/**
* Returns the time at which this particular record was recorded or updated.
*/
INLINE time_t BamCacheRecord::
get_recorded_time() const {
return _recorded_time;
}
/**
* Returns the number of source files that contribute to the cache.
*/
INLINE int BamCacheRecord::
get_num_dependent_files() const {
return _files.size();
}
/**
* Returns the full pathname of the nth source files that contributes to the
* cache.
*/
INLINE const Filename &BamCacheRecord::
get_dependent_pathname(int n) const {
nassertr(n >= 0 && n < (int)_files.size(), _files[0]._pathname);
return _files[n]._pathname;
}
/**
* Returns true if this cache record has an in-memory data object associated--
* that is, the object stored in the cache.
*/
INLINE bool BamCacheRecord::
has_data() const {
return (_ptr != nullptr);
}
/**
* Removes the in-memory data object associated with this record, if any.
* This does not affect the on-disk representation of the record.
*/
INLINE void BamCacheRecord::
clear_data() {
if (_ref_ptr != nullptr) {
unref_delete(_ref_ptr);
}
_ptr = nullptr;
_ref_ptr = nullptr;
}
/**
* Returns a pointer to the data stored in the record, or NULL if there is no
* data. The pointer is not removed from the record.
*/
INLINE TypedWritable *BamCacheRecord::
get_data() const {
return _ptr;
}
/**
* Fills ptr and ref_ptr with the two different-typed pointers to the same
* object, the data stored within this record. This transfers ownership of
* the data pointer; the caller will be responsible for managing the reference
* counts on this object subsequently.
*
* Returns true if the record contained any data (and the pointers have been
* filled), false if it didn't (and the pointers are NULL).
*/
INLINE bool BamCacheRecord::
extract_data(TypedWritable *&ptr, ReferenceCount *&ref_ptr) {
ptr = _ptr;
ref_ptr = _ref_ptr;
clear_data();
return (ptr != nullptr);
}
/**
* Stores a new data object on the record. You should pass the same pointer
* twice, to both parameters; this allows the C++ typecasting to automatically
* convert the pointer into both a TypedWritable and a ReferenceCount pointer,
* so that the BamCacheRecord object can reliably manage the reference counts.
*
* You may pass 0 or NULL as the second parameter. If you do this, the
* BamCacheRecord will not manage the object's reference count; it will be up
* to you to ensure the object is not deleted during the lifetime of the
* BamCacheRecord object.
*/
INLINE void BamCacheRecord::
set_data(TypedWritable *ptr, ReferenceCount *ref_ptr) {
if (_ptr != ptr) {
clear_data();
_ptr = ptr;
_ref_ptr = ref_ptr;
if (_ref_ptr != nullptr) {
_ref_ptr->ref();
}
}
}
/**
* This variant on set_data() is provided to easily pass objects deriving from
* TypedWritable.
*/
INLINE void BamCacheRecord::
set_data(TypedWritable *ptr) {
set_data(ptr, ptr->as_reference_count());
}
/**
* This variant on set_data() is provided to easily pass objects deriving from
* TypedWritableReferenceCount.
*/
INLINE void BamCacheRecord::
set_data(TypedWritableReferenceCount *ptr) {
set_data((TypedWritable *)ptr, (ReferenceCount *)ptr);
}
/**
* This variant on set_data() is provided just to allow Python code to pass a
* 0 as the second parameter.
*/
INLINE void BamCacheRecord::
set_data(TypedWritable *ptr, int dummy) {
nassertv(dummy == 0);
set_data(ptr, nullptr);
}
/**
* Returns true if a sorts before b, false otherwise.
*/
INLINE bool BamCacheRecord::SortByAccessTime::
operator () (const BamCacheRecord *a, const BamCacheRecord *b) const {
return (a->_record_access_time < b->_record_access_time);
}