Merge pull request #2629 from akohlmey/citeme-use-hash
Use a 64-bit hash in the CiteMe class to identify unique citations
This commit is contained in:
@ -15,6 +15,8 @@
|
|||||||
#include "comm.h"
|
#include "comm.h"
|
||||||
#include "universe.h"
|
#include "universe.h"
|
||||||
|
|
||||||
|
#include <functional>
|
||||||
|
|
||||||
using namespace LAMMPS_NS;
|
using namespace LAMMPS_NS;
|
||||||
|
|
||||||
static const char cite_separator[] =
|
static const char cite_separator[] =
|
||||||
@ -26,6 +28,9 @@ static const char cite_nagline[] =
|
|||||||
static const char cite_file[] = "The {} {} lists these citations in "
|
static const char cite_file[] = "The {} {} lists these citations in "
|
||||||
"BibTeX format.\n\n";
|
"BibTeX format.\n\n";
|
||||||
|
|
||||||
|
// define hash function
|
||||||
|
static std::hash<std::string> get_hash;
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------- */
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
CiteMe::CiteMe(LAMMPS *lmp, int _screen, int _logfile, const char *_file)
|
CiteMe::CiteMe(LAMMPS *lmp, int _screen, int _logfile, const char *_file)
|
||||||
@ -68,14 +73,16 @@ CiteMe::~CiteMe()
|
|||||||
process an added citation so it will be shown only once and as requested
|
process an added citation so it will be shown only once and as requested
|
||||||
------------------------------------------------------------------------- */
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
void CiteMe::add(const char *ref)
|
void CiteMe::add(const std::string &reference)
|
||||||
{
|
{
|
||||||
if (comm->me != 0) return;
|
if (comm->me != 0) return;
|
||||||
if (cs->find(ref) != cs->end()) return;
|
|
||||||
cs->insert(ref);
|
std::size_t crc = get_hash(reference);
|
||||||
|
if (cs->find(crc) != cs->end()) return;
|
||||||
|
cs->insert(crc);
|
||||||
|
|
||||||
if (fp) {
|
if (fp) {
|
||||||
fputs(ref,fp);
|
fputs(reference.c_str(),fp);
|
||||||
fflush(fp);
|
fflush(fp);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -93,7 +100,6 @@ void CiteMe::add(const char *ref)
|
|||||||
if (logfile_flag == VERBOSE) logbuffer += "\n";
|
if (logfile_flag == VERBOSE) logbuffer += "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string reference = ref;
|
|
||||||
std::size_t found = reference.find_first_of("\n");
|
std::size_t found = reference.find_first_of("\n");
|
||||||
std::string header = reference.substr(0,found+1);
|
std::string header = reference.substr(0,found+1);
|
||||||
if (screen_flag == VERBOSE) scrbuffer += "- " + reference;
|
if (screen_flag == VERBOSE) scrbuffer += "- " + reference;
|
||||||
|
|||||||
@ -23,7 +23,7 @@ class CiteMe : protected Pointers {
|
|||||||
public:
|
public:
|
||||||
CiteMe(class LAMMPS *, int, int, const char *);
|
CiteMe(class LAMMPS *, int, int, const char *);
|
||||||
virtual ~CiteMe();
|
virtual ~CiteMe();
|
||||||
void add(const char *); // register publication for output
|
void add(const std::string &); // register publication for output
|
||||||
void flush(); // flush buffers to screen and logfile
|
void flush(); // flush buffers to screen and logfile
|
||||||
enum {VERBOSE, TERSE};
|
enum {VERBOSE, TERSE};
|
||||||
|
|
||||||
@ -34,7 +34,7 @@ class CiteMe : protected Pointers {
|
|||||||
int logfile_flag; // determine whether verbose or terse output
|
int logfile_flag; // determine whether verbose or terse output
|
||||||
std::string scrbuffer; // output buffer for screen
|
std::string scrbuffer; // output buffer for screen
|
||||||
std::string logbuffer; // output buffer for logfile
|
std::string logbuffer; // output buffer for logfile
|
||||||
typedef std::set<const char *> citeset;
|
typedef std::set<std::size_t> citeset;
|
||||||
citeset *cs; // registered set of publications
|
citeset *cs; // registered set of publications
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@ -13,6 +13,7 @@
|
|||||||
|
|
||||||
#include "lammps.h"
|
#include "lammps.h"
|
||||||
|
|
||||||
|
#include "citeme.h"
|
||||||
#include "force.h"
|
#include "force.h"
|
||||||
#include "info.h"
|
#include "info.h"
|
||||||
#include "input.h"
|
#include "input.h"
|
||||||
@ -368,6 +369,51 @@ TEST_F(SimpleCommandsTest, Shell)
|
|||||||
ASSERT_THAT(other_var, StrEq("2"));
|
ASSERT_THAT(other_var, StrEq("2"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(SimpleCommandsTest, CiteMe)
|
||||||
|
{
|
||||||
|
ASSERT_EQ(lmp->citeme, nullptr);
|
||||||
|
|
||||||
|
lmp->citeme = new LAMMPS_NS::CiteMe(lmp, CiteMe::TERSE, CiteMe::TERSE, nullptr);
|
||||||
|
|
||||||
|
::testing::internal::CaptureStdout();
|
||||||
|
lmp->citeme->add("test citation one:\n 1\n");
|
||||||
|
lmp->citeme->add("test citation two:\n 2\n");
|
||||||
|
lmp->citeme->add("test citation one:\n 1\n");
|
||||||
|
lmp->citeme->flush();
|
||||||
|
std::string text = ::testing::internal::GetCapturedStdout();
|
||||||
|
if (verbose) std::cout << text;
|
||||||
|
|
||||||
|
// find the two unique citations, but not the third
|
||||||
|
ASSERT_THAT(text, MatchesRegex(".*one.*two.*"));
|
||||||
|
ASSERT_THAT(text, Not(MatchesRegex(".*one.*two.*one.*")));
|
||||||
|
|
||||||
|
::testing::internal::CaptureStdout();
|
||||||
|
lmp->citeme->add("test citation one:\n 0\n");
|
||||||
|
lmp->citeme->add("test citation two:\n 2\n");
|
||||||
|
lmp->citeme->add("test citation three:\n 3\n");
|
||||||
|
lmp->citeme->flush();
|
||||||
|
|
||||||
|
text = ::testing::internal::GetCapturedStdout();
|
||||||
|
if (verbose) std::cout << text;
|
||||||
|
|
||||||
|
// find the forth (only differs in long citation) and sixth added citation
|
||||||
|
ASSERT_THAT(text, MatchesRegex(".*one.*three.*"));
|
||||||
|
ASSERT_THAT(text, Not(MatchesRegex(".*two.*")));
|
||||||
|
|
||||||
|
::testing::internal::CaptureStdout();
|
||||||
|
lmp->citeme->add("test citation one:\n 1\n");
|
||||||
|
lmp->citeme->add("test citation two:\n 2\n");
|
||||||
|
lmp->citeme->add("test citation one:\n 0\n");
|
||||||
|
lmp->citeme->add("test citation two:\n 2\n");
|
||||||
|
lmp->citeme->add("test citation three:\n 3\n");
|
||||||
|
lmp->citeme->flush();
|
||||||
|
|
||||||
|
text = ::testing::internal::GetCapturedStdout();
|
||||||
|
if (verbose) std::cout << text;
|
||||||
|
|
||||||
|
// no new citation. no CITE-CITE-CITE- lines
|
||||||
|
ASSERT_THAT(text, Not(MatchesRegex(".*CITE-CITE-CITE-CITE.*")));
|
||||||
|
}
|
||||||
} // namespace LAMMPS_NS
|
} // namespace LAMMPS_NS
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
|
|||||||
Reference in New Issue
Block a user