blob: 744f23c0226238fce875e519e302530ba6bee0aa [file] [log] [blame]
//===---------------------- FunctionDescriptor.cpp -----------------------===//
//
// SPIR Tools
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===---------------------------------------------------------------------===//
/*
* Contributed by: Intel Corporation.
*/
#include "FunctionDescriptor.h"
#include "ParameterType.h"
#include <sstream>
namespace SPIR {
std::string FunctionDescriptor::nullString() {
return std::string("<invalid>");
}
std::string FunctionDescriptor::toString() const {
std::stringstream stream;
if (isNull()) {
return FunctionDescriptor::nullString();
}
stream << name << "(";
size_t paramCount = parameters.size();
if (paramCount > 0) {
for (size_t i=0 ; i<paramCount-1 ; ++i)
stream << parameters[i]->toString() << ", ";
stream << parameters[paramCount-1]->toString();
}
stream << ")";
return stream.str();
}
static bool equal(const TypeVector& l, const TypeVector& r) {
if (&l == &r)
return true;
if (l.size() != r.size())
return false;
TypeVector::const_iterator itl = l.begin(), itr = r.begin(),
endl = l.end();
while (itl != endl) {
if (!(*itl)->equals(*itr))
return false;
++itl;
++itr;
}
return true;
}
//
// FunctionDescriptor
//
bool FunctionDescriptor::operator == (const FunctionDescriptor& that) const {
if (this == &that)
return true;
if (name != that.name)
return false;
return equal(parameters, that.parameters);
}
bool FunctionDescriptor::operator < (const FunctionDescriptor& that) const {
int strCmp = name.compare(that.name);
if (strCmp)
return (strCmp < 0);
size_t len = parameters.size(), thatLen = that.parameters.size();
if (len != thatLen)
return len < thatLen;
TypeVector::const_iterator it = parameters.begin(),
e = parameters.end(), thatit = that.parameters.begin();
while (it != e) {
int cmp = (*it)->toString().compare((*thatit)->toString());
if (cmp)
return (cmp < 0);
++thatit;
++it;
}
return false;
}
bool FunctionDescriptor::isNull() const {
return (name.empty() && parameters.empty());
}
FunctionDescriptor FunctionDescriptor::null() {
FunctionDescriptor fd;
fd.name = "";
return fd;
}
} // End SPIR namespace