//============================================================================== bool LRBSpline2D::operator<(const LRBSpline2D& rhs) const //============================================================================== { const int tmp1 = compare_seq(kvec_u_.begin(), kvec_u_.end(), rhs.kvec_u_.begin(), rhs.kvec_u_.end()); if (tmp1 != 0) return (tmp1 < 0); const int tmp2 = compare_seq(kvec_v_.begin(), kvec_v_.end(), rhs.kvec_v_.begin(), rhs.kvec_v_.end()); if (tmp2 != 0) return (tmp2 < 0); const int tmp3 = compare_seq(coef_times_gamma_.begin(), coef_times_gamma_.end(), rhs.coef_times_gamma_.begin(), rhs.coef_times_gamma_.end()); if (tmp3 != 0) return (tmp3 < 0); return gamma_ < rhs.gamma_; }
//////////////////////////////////////////////////////////////////// // Function: PPInstance::compare_seq // Access: Private, Static // Description: Compares the two dotted-integer sequence values // numerically. Returns -1 if seq_a sorts first, 1 if // seq_b sorts first, 0 if they are equivalent. //////////////////////////////////////////////////////////////////// int PPInstance:: compare_seq(const string &seq_a, const string &seq_b) { const char *num_a = seq_a.c_str(); const char *num_b = seq_b.c_str(); int comp = compare_seq_int(num_a, num_b); while (comp == 0) { if (*num_a != '.') { if (*num_b != '.') { // Both strings ran out together. return 0; } // a ran out first. return -1; } else if (*num_b != '.') { // b ran out first. return 1; } // Increment past the dot. ++num_a; ++num_b; comp = compare_seq(num_a, num_b); } return comp; }
//////////////////////////////////////////////////////////////////// // Function: PPInstance::read_contents_file // Access: Private // Description: Attempts to open and read the contents.xml file on // disk. Copies the file to its standard location // on success. Returns true on success, false on // failure. //////////////////////////////////////////////////////////////////// bool PPInstance:: read_contents_file(const string &contents_filename, bool fresh_download) { TiXmlDocument doc(contents_filename.c_str()); if (!doc.LoadFile()) { return false; } bool found_core_package = false; TiXmlElement *xcontents = doc.FirstChildElement("contents"); if (xcontents != NULL) { int max_age = P3D_CONTENTS_DEFAULT_MAX_AGE; xcontents->Attribute("max_age", &max_age); // Get the latest possible expiration time, based on the max_age // indication. Any expiration time later than this is in error. time_t now = time(NULL); _contents_expiration = now + (time_t)max_age; if (fresh_download) { // Update the XML with the new download information. TiXmlElement *xorig = xcontents->FirstChildElement("orig"); while (xorig != NULL) { xcontents->RemoveChild(xorig); xorig = xcontents->FirstChildElement("orig"); } xorig = new TiXmlElement("orig"); xcontents->LinkEndChild(xorig); xorig->SetAttribute("expiration", (int)_contents_expiration); } else { // Read the expiration time from the XML. int expiration = 0; TiXmlElement *xorig = xcontents->FirstChildElement("orig"); if (xorig != NULL) { xorig->Attribute("expiration", &expiration); } _contents_expiration = min(_contents_expiration, (time_t)expiration); } nout << "read contents.xml, max_age = " << max_age << ", expires in " << max(_contents_expiration, now) - now << " s\n"; // Look for the <host> entry; it might point us at a different // download URL, and it might mention some mirrors. find_host(xcontents); // Now look for the core API package. _coreapi_set_ver = ""; TiXmlElement *xpackage = xcontents->FirstChildElement("package"); while (xpackage != NULL) { const char *name = xpackage->Attribute("name"); if (name != NULL && strcmp(name, "coreapi") == 0) { const char *platform = xpackage->Attribute("platform"); if (platform != NULL && strcmp(platform, DTOOL_PLATFORM) == 0) { _coreapi_dll.load_xml(xpackage); const char *set_ver = xpackage->Attribute("set_ver"); if (set_ver != NULL) { _coreapi_set_ver = set_ver; } found_core_package = true; break; } } xpackage = xpackage->NextSiblingElement("package"); } } if (!found_core_package) { // Couldn't find the coreapi package description. nout << "No coreapi package defined in contents file for " << DTOOL_PLATFORM << "\n"; return false; } // Check the coreapi_set_ver token. If it is given, it specifies a // minimum Core API version number we expect to find. If we didn't // find that number, perhaps our contents.xml is out of date. string coreapi_set_ver = lookup_token("coreapi_set_ver"); if (!coreapi_set_ver.empty()) { nout << "Instance asked for Core API set_ver " << coreapi_set_ver << ", we found " << _coreapi_set_ver << "\n"; // But don't bother if we just freshly downloaded it. if (!fresh_download) { if (compare_seq(coreapi_set_ver, _coreapi_set_ver) > 0) { // The requested set_ver value is higher than the one we have on // file; our contents.xml file must be out of date after all. nout << "expiring contents.xml\n"; _contents_expiration = 0; } } } // Success. Now save the file in its proper place. string standard_filename = m_rootDir + "/contents.xml"; mkfile_complete(standard_filename, nout); if (!doc.SaveFile(standard_filename.c_str())) { nout << "Couldn't rewrite " << standard_filename << "\n"; return false; } return true; }
//============================================================================== bool LRBSpline2D::operator==(const LRBSpline2D& rhs) const //============================================================================== { #if 0//ndef NDEBUG // double umi = umin(); // double uma = umax(); // double vmi = vmin(); // double vma = vmax(); // std::cout << "umin: " << umi << ", umax: " << uma << ", vmin: " << vmi << ", vmax: " << vma << std::endl; auto iter = kvec_u_.begin(); std::cout << "DEBUG: kvec_u_: "; while (iter != kvec_u_.end()) { std::cout << *iter << " "; ++iter; } std::cout << "kvec_v_: "; iter = kvec_v_.begin(); while (iter != kvec_v_.end()) { std::cout << *iter << " "; ++iter; } std::cout << std::endl; iter = rhs.kvec_u_.begin(); std::cout << "DEBUG: rhs.kvec_u_: "; while (iter != rhs.kvec_u_.end()) { std::cout << *iter << " "; ++iter; } iter = rhs.kvec_v_.begin(); std::cout << "rhs.kvec_v_: "; while (iter != rhs.kvec_v_.end()) { std::cout << *iter << " "; ++iter; } std::cout << std::endl; #endif #ifndef NDEBUG int kvec_u_size = kvec_u_.size(); int kvec_v_size = kvec_v_.size(); int kvec_u_size2 = rhs.kvec_u_.size(); int kvec_v_size2 = rhs.kvec_v_.size(); if ((kvec_u_size != kvec_u_size2) || (kvec_v_size != kvec_v_size2)) MESSAGE("DEBUG: Pairwise vectors are of different size!"); // ; #endif const int tmp1 = compare_seq(kvec_u_.begin(), kvec_u_.end(), rhs.kvec_u_.begin(), rhs.kvec_u_.end()); if (tmp1 != 0) return false; const int tmp2 = compare_seq(kvec_v_.begin(), kvec_v_.end(), rhs.kvec_v_.begin(), rhs.kvec_v_.end()); if (tmp2 != 0) return false; return true; }