=== modified file 'Makefile'
@@ -21,7 +21,7 @@
program.o: program.cc program.h mat.h vec.h
log.o: log.cc log.h
util.o: util.cc util.h
-shader-source.o: shader-source.cc shader-source.h mat.h vec.h
+shader-source.o: shader-source.cc shader-source.h mat.h vec.h util.h
libmatrix.a : mat.o stack.h program.o log.o util.o shader-source.o
$(AR) -r $@ $(LIBOBJS)
=== modified file 'util.cc'
@@ -26,14 +26,26 @@
using std::vector;
void
-Util::split(const string& src, char delim, vector<string>& elementVec)
+Util::split(const string& src, char delim, vector<string>& elementVec, bool fuzzy)
{
+ // Trivial rejection
if (src.empty())
{
return;
}
- // Initialize our delimiter string based upon the caller's plus a space
- // to allow for more flexibility.
+
+ // Simple case: we want to enforce the value of 'delim' strictly
+ if (!fuzzy)
+ {
+ std::stringstream ss(src);
+ string item;
+ while(std::getline(ss, item, delim))
+ elementVec.push_back(item);
+ return;
+ }
+
+ // Fuzzy case: Initialize our delimiter string based upon the caller's plus
+ // a space to allow for more flexibility.
string delimiter(" ");
delimiter += delim;
// Starting index into the string of the first token (by definition, if
=== modified file 'util.h'
@@ -25,25 +25,52 @@
struct Util {
/**
- * split() - Splits a string into elements separated by a delimiter
- *
- * @s: the string to split
- * @delim: the delimiter to use
- * @elems: the string vector to populate
- *
- * Splits @s into a vector of string elements, delimited by @delim, that
- * get returned in @elems. The handling of @delim allows for spaces on
- * either side of the delimiter or even multiple consecutive delimiters
- * with no elements between. As long as @s is non-empty, there will be
- * at least one element in @elems.
+ * split() - Splits a string into elements using a provided delimiter
+ *
+ * @s: the string to split
+ * @delim: the delimiter to use
+ * @elems: the string vector to populate
+ * @fuzzy: (optional) enable/disable strict handling of @delim
+ *
+ * Using @delim to determine field boundaries, splits @s into separate
+ * string elements. These elements are returned in the string vector
+ * @elems. If @fuzzy is true, then the handling of @delim allows for
+ * spaces and multiple consecutive occurences of @delim in determining
+ * field boundaries. As long as @s is non-empty, there will be at least
+ * one element in @elems.
*/
- static void split(const std::string &s, char delim, std::vector<std::string> &elems);
+ static void split(const std::string &s, char delim, std::vector<std::string> &elems, bool fuzzy = false);
/**
* get_timestamp_us() - Returns the current time in microseconds
*/
static uint64_t get_timestamp_us();
+ /**
+ * get_resource() - Gets an input filestream for a given file.
+ *
+ * @path: the path to the file
+ *
+ * Returns a pointer to an input stream, which must be deleted when no
+ * longer in use.
+ */
static std::istream *get_resource(const std::string &path);
+ /**
+ * list_files() - Get a list of the files in a given directory.
+ *
+ * @dirName: the directory path to be listed.
+ * @fileVec: the string vector to populate.
+ *
+ * Obtains a list of the files in @dirName, and returns them in the string
+ * vector @fileVec.
+ */
static void list_files(const std::string& dirName, std::vector<std::string>& fileVec);
+ /**
+ * dispose_pointer_vector() - cleans up a vector of pointers
+ *
+ * @vec: vector of pointers to objects or plain-old-data
+ *
+ * Iterates across @vec and deletes the data pointed to by each of the
+ * elements. Clears the vector, resetting it for reuse.
+ */
template <class T> static void dispose_pointer_vector(std::vector<T*> &vec)
{
for (typename std::vector<T*>::const_iterator iter = vec.begin();
@@ -55,6 +82,11 @@
vec.clear();
}
+ /**
+ * toString() - Converts a string to a plain-old-data type.
+ *
+ * @asString: a string representation of plain-old-data.
+ */
template<typename T>
static T
fromString(const std::string& asString)
@@ -64,7 +96,11 @@
ss >> retVal;
return retVal;
}
-
+ /**
+ * toString() - Converts a plain-old-data type to a string.
+ *
+ * @t: a simple value to be converted to a string
+ */
template<typename T>
static std::string
toString(const T t)
@@ -73,6 +109,13 @@
ss << t;
return ss.str();
}
+ /**
+ * appname_from_path() - get the name of an executable from an absolute path
+ *
+ * @path: absolute path of the running application (argv[0])
+ *
+ * Returns the last portion of @path (everything after the final '/').
+ */
static std::string
appname_from_path(const std::string& path);