diff --git a/core/tags/generic.cpp b/core/tags/generic.cpp new file mode 100644 index 00000000..d800d9ef --- /dev/null +++ b/core/tags/generic.cpp @@ -0,0 +1,39 @@ +/** + * @file + * Copyright 2014 (c) Anna Schumaker. + */ +#include +#include + +GenericTag :: GenericTag() {} + +GenericTag :: GenericTag(const std::string &name) + : _name(name), _lower(filter :: lowercase(name)) +{ +} + +const std::string GenericTag :: primary_key() const +{ + return _name; +} + +void GenericTag :: read(File &file) +{ + _name = file.getline(); + _lower = filter :: lowercase(_name); +} + +void GenericTag :: write(File &file) +{ + file << _name; +} + +const std::string &GenericTag :: name() +{ + return _name; +} + +const std::string &GenericTag :: lowercase() +{ + return _lower; +} diff --git a/include/core/tags/generic.h b/include/core/tags/generic.h new file mode 100644 index 00000000..4ca77dc9 --- /dev/null +++ b/include/core/tags/generic.h @@ -0,0 +1,74 @@ +/** + * @file + * Copyright 2014 (c) Anna Schumaker. + */ +#ifndef OCARINA_CORE_TAGS_GENERIC_H +#define OCARINA_CORE_TAGS_GENERIC_H + +#include + +/** + * The GenericTag class implements the basic functions that all + * tag classes need. All other tag structures should inherit + * from this class to have access to all the basic features. + * + * When writing a GenericTag to disk, only the _name field needs + * to be written. + * + * ... << name1 + * ... << name2 + * ... << name3 + + */ +class GenericTag : public DatabaseEntry { +private: + std::string _name; /**< The name associated with this tag. */ + std::string _lower; /**< The lowercase form of ::_name. */ + +public: + GenericTag(); /**< GenericTag constructor. */ + + /** + * Generic tag constructor. + * + * @param name Name to associate with this tag. + */ + GenericTag(const std::string &); + + /** + * Called to access the generic tag's primary key. + * + * @return ::_name. + */ + virtual const std::string primary_key() const; + + /** + * Read ::_name from file and find the lowercase form. + * + * @param file The file to read from. + */ + virtual void read(File &); + + /** + * Write ::_name to file. + * + * @param file The file to write to. + */ + virtual void write(File &); + + /** + * Called to access the name associated with this tag. + * + * @return ::_name. + */ + const std::string &name(); + + /** + * Called to access the lowercase form of ::_name. + * + * @return ::_lower. + */ + const std::string &lowercase(); +}; + +#endif /* OCARINA_CORE_TAGS_GENERIC_H */ diff --git a/tests/core/Sconscript b/tests/core/Sconscript index 99d05136..191309e0 100644 --- a/tests/core/Sconscript +++ b/tests/core/Sconscript @@ -14,6 +14,7 @@ test( "index" ) test( "filter" ) test( "idle" ) +test( "tags/generic" ) test( "tags/artist" ) test_env.UsePackage("taglib") diff --git a/tests/core/tags/.gitignore b/tests/core/tags/.gitignore index d489cd46..cd17a1bc 100644 --- a/tests/core/tags/.gitignore +++ b/tests/core/tags/.gitignore @@ -1 +1,2 @@ artist +generic diff --git a/tests/core/tags/generic.cpp b/tests/core/tags/generic.cpp new file mode 100644 index 00000000..79a4c758 --- /dev/null +++ b/tests/core/tags/generic.cpp @@ -0,0 +1,39 @@ +/** + * @file + * Copyright 2014 (c) Anna Schumaker. + */ +#include +#include + +static void test_generic_tag() +{ + GenericTag tag("Generic Tag"); + File f("generic_tag", 0); + + test_equal(tag.name(), (std::string)"Generic Tag"); + test_equal(tag.lowercase(), (std::string)"generic tag"); + test_equal(tag.primary_key(), (std::string)"Generic Tag"); + + f.open(OPEN_WRITE); + tag.write(f); + f.close(); + + tag = GenericTag(); + test_equal(tag.name(), (std::string)""); + test_equal(tag.lowercase(), (std::string)""); + test_equal(tag.primary_key(), (std::string)""); + + f.open(OPEN_READ); + tag.read(f); + f.close(); + + test_equal(tag.name(), (std::string)"Generic Tag"); + test_equal(tag.lowercase(), (std::string)"generic tag"); + test_equal(tag.primary_key(), (std::string)"Generic Tag"); +} + +int main(int argc, char **argv) +{ + run_test("Generic Tag Test", test_generic_tag); + return 0; +}