Empirical
Citation.h
Go to the documentation of this file.
1 // This file is part of Empirical, https://github.com/devosoft/Empirical
2 // Copyright (C) Michigan State University, 2016-2017.
3 // Released under the MIT Software license; see doc/LICENSE
4 //
5 //
6 // Information about a citation for a single paper / book / etc.
7 
8 #ifndef EMP_CITATION_H
9 #define EMP_CITATION_H
10 
11 #include <ostream>
12 #include <map>
13 #include <set>
14 #include <string>
15 
16 #include "../base/vector.h"
17 #include "../tools/map_utils.h"
18 #include "../tools/string_utils.h"
19 #include "Author.h"
20 
21 namespace emp {
22 
23  class Citation {
24  public:
27  private:
28  CITE_TYPE type;
29  emp::vector<Author> author_list;
30  emp::vector<std::string> notes; // An optional note.
31  std::set<std::string> keywords; // Optional keywords.
32 
33  std::map<std::string, std::string> setting_map;
34 
35  static const std::map<std::string, CITE_TYPE> & GetNameMap() {
36  static std::map<std::string, CITE_TYPE> name_map;
37  if (name_map.size() == 0) {
38  name_map["unknown"] = UNKNOWN;
39  name_map["article"] = ARTICLE;
40  name_map["book"] = BOOK;
41  name_map["booklet"] = BOOKLET;
42  name_map["conference"] = CONFERENCE;
43  name_map["inbook"] = IN_BOOK;
44  name_map["incollection"] = IN_COLLECTION;
45  name_map["manual"] = MANUAL;
46  name_map["mastersthesis"] = MASTERS_THESIS;
47  name_map["misc"] = MISC;
48  name_map["phdthesis"] = PHD_THESIS;
49  name_map["proceedings"] = PROCEEDINGS;
50  name_map["techreport"] = TECH_REPORT;
51  name_map["unpublished"] = UNPUBLISHED;
52  }
53  return name_map;
54  }
55 
56  // Name map in opposite direction (enum -> name)
57  static const std::multimap<CITE_TYPE, std::string> & GetRNameMap() {
58  static const auto rname_map = emp::flip_map(GetNameMap());
59  return rname_map;
60  }
61 
62  public:
63  Citation(CITE_TYPE in_type=UNKNOWN) : type(in_type) { ; }
64  Citation(const Citation &) = default;
65  ~Citation() { ; }
66  Citation & operator=(const Citation &) = default;
67 
68  CITE_TYPE GetType() const { return type; }
69  const emp::vector<Author> & GetAuthors() const { return author_list; }
70  const emp::vector<std::string> & GetNotes() const { return notes; }
71  const std::set<std::string> & GetKeywords() const { return keywords; }
72  const bool HasKeyword(const std::string & kw) const {
73  return keywords.find(kw) != keywords.end();
74  }
75 
76  const std::string & GetVal(const std::string & setting) const {
77  return emp::FindRef(setting_map, setting, emp::empty_string());
78  }
79 
80  const std::string & GetTitle() const { return GetVal("title"); }
81  const std::string & GetJournal() const { return GetVal("journal"); } // If in journal
82  const std::string & GetBookTitle() const { return GetVal("book_title"); } // If in book
83  const std::string & GetVolume() const { return GetVal("volume"); }
84  const std::string & GetYear() const { return GetVal("year"); }
85  const std::string & GetNumber() const { return GetVal("number"); }
86  const std::string & GetMonth() const { return GetVal("month"); }
87  const std::string & GetStartPage() const { return GetVal("start_page"); }
88  const std::string & GetEndPage() const { return GetVal("end_page"); }
89 
90  template <typename... ARGS>
91  Citation & AddAuthor(ARGS &&... args) {
92  author_list.emplace_back(std::forward<ARGS>(args)...);
93  return *this;
94  }
95  Citation & AddNote(const std::string & note) { notes.push_back(note); return *this; }
96  Citation & AddKeyword(const std::string & kw) { keywords.insert(kw); return *this; }
97 
98  template <class T> Citation & SetVal(const std::string & setting, T && val) {
99  setting_map[to_lower(setting)] = to_string(val);
100  return *this;
101  }
102 
103  template <class T> Citation & SetTitle(T && val) { return SetVal("title", val); }
104  template <class T> Citation & SetJournal(T && val) { return SetVal("journal", val); } // If in journal
105  template <class T> Citation & SetBookTitle(T && val) { return SetVal("book_title", val); } // If in book
106  template <class T> Citation & SetVolume(T && val) { return SetVal("volume", val); }
107  template <class T> Citation & SetYear(T && val) { return SetVal("year", val); }
108  template <class T> Citation & SetNumber(T && val) { return SetVal("number", val); }
109  template <class T> Citation & SetMonth(T && val) { return SetVal("month", val); }
110  template <class T> Citation & SetStartPage(T && val) { return SetVal("start_page", val); }
111  template <class T> Citation & SetEndPage(T && val) { return SetVal("end_page", val); }
112  template <class T> Citation & SetPages(T && p1, T && p2) { SetStartPage(p1); return SetEndPage(p2); }
113 
114  void SetType(CITE_TYPE in_type) { type = in_type; }
115  void SetType(std::string in_type) {
116  in_type = to_lower(in_type); // <Make sure type is lowercase.
117  const auto & name_map = GetNameMap();
118  auto map_it = name_map.find(in_type);
119  if (map_it == name_map.end()) type = ERROR;
120  else type = map_it->second;
121  }
122 
123  // Printing helpers...
124  void PrintAuthors(std::ostream & out=std::cout) {
125  if (author_list.size() == 0) return; // Stop if no authors.
126  out << author_list[0].GetReverseName(); // Print first author.
127 
128  // Print middle authors...
129  for (size_t i = 1; i < author_list.size() - 1; i++) {
130  out << ", " << author_list[i].GetFullName();
131  }
132 
133  // Print last author.
134  if (author_list.size() > 1) out << ", and " << author_list.back().GetFullName();
135  }
136 
137  // By default, print a standard citation style.
138  void PrintERROR(std::ostream & out=std::cout) { out << "ERROR with printing citation."; }
139  void PrintUNKNOWN(std::ostream & out=std::cout) { (void) out; } // Dynamically guess type?
140  void PrintARTICLE(std::ostream & out=std::cout) { PrintAuthors(out); out << std::endl; }
141  void PrintBOOK(std::ostream & out=std::cout) { (void) out; }
142  void PrintBOOKLET(std::ostream & out=std::cout) { (void) out; }
143  void PrintCONFERENCE(std::ostream & out=std::cout) { (void) out; }
144  void PrintIN_BOOK(std::ostream & out=std::cout) { (void) out; }
145  void PrintIN_COLLECTION(std::ostream & out=std::cout) { (void) out; }
146  void PrintMANUAL(std::ostream & out=std::cout) { (void) out; }
147  void PrintMASTERS_THESIS(std::ostream & out=std::cout) { (void) out; }
148  void PrintMISC(std::ostream & out=std::cout) { (void) out; }
149  void PrintPHD_THESIS(std::ostream & out=std::cout) { (void) out; }
150  void PrintPROCEEDINGS(std::ostream & out=std::cout) { (void) out; }
151  void PrintTECH_REPORT(std::ostream & out=std::cout) { (void) out; }
152  void PrintUNPUBLISHED(std::ostream & out=std::cout) { (void) out; }
153 
154  void Print(std::ostream & out=std::cout) {
155  switch (type) {
156  case ERROR: PrintERROR(out); break;
157  case UNKNOWN: PrintUNKNOWN(out); break;
158  case ARTICLE: PrintARTICLE(out); break;
159  case BOOK: PrintBOOK(out); break;
160  case BOOKLET: PrintBOOKLET(out); break;
161  case CONFERENCE: PrintCONFERENCE(out); break;
162  case IN_BOOK: PrintIN_BOOK(out); break;
163  case IN_COLLECTION: PrintIN_COLLECTION(out); break;
164  case MANUAL: PrintMANUAL(out); break;
165  case MASTERS_THESIS: PrintMASTERS_THESIS(out); break;
166  case MISC: PrintMISC(out); break;
167  case PHD_THESIS: PrintPHD_THESIS(out); break;
168  case PROCEEDINGS: PrintPROCEEDINGS(out); break;
169  case TECH_REPORT: PrintTECH_REPORT(out); break;
170  case UNPUBLISHED: PrintUNPUBLISHED(out); break;
171  }
172  }
173  };
174 
175 }
176 
177 #endif
static const std::string & empty_string()
Definition: string_utils.h:29
void PrintIN_BOOK(std::ostream &out=std::cout)
Definition: Citation.h:144
Citation & SetEndPage(T &&val)
Definition: Citation.h:111
void PrintMANUAL(std::ostream &out=std::cout)
Definition: Citation.h:146
Citation & SetMonth(T &&val)
Definition: Citation.h:109
Citation & AddKeyword(const std::string &kw)
Definition: Citation.h:96
std::multimap< B, A > flip_map(const std::map< A, B > &src)
Take an std::map<A,B> and return the flipped map (now multimap to be safe): std::multimap<B,A>
Definition: map_utils.h:56
void SetType(std::string in_type)
Definition: Citation.h:115
void PrintBOOKLET(std::ostream &out=std::cout)
Definition: Citation.h:142
std::string to_string(ALL_TYPES &&...all_values)
Definition: string_utils.h:511
const std::string & GetVolume() const
Definition: Citation.h:83
void PrintIN_COLLECTION(std::ostream &out=std::cout)
Definition: Citation.h:145
void PrintMASTERS_THESIS(std::ostream &out=std::cout)
Definition: Citation.h:147
const std::string & GetTitle() const
Definition: Citation.h:80
Citation & AddNote(const std::string &note)
Definition: Citation.h:95
Definition: Citation.h:25
Definition: Citation.h:25
Definition: Citation.h:25
const std::string & GetMonth() const
Definition: Citation.h:86
void PrintTECH_REPORT(std::ostream &out=std::cout)
Definition: Citation.h:151
void SetType(CITE_TYPE in_type)
Definition: Citation.h:114
void PrintBOOK(std::ostream &out=std::cout)
Definition: Citation.h:141
void Print(std::ostream &out=std::cout)
Definition: Citation.h:154
Definition: Citation.h:23
Definition: Citation.h:25
const emp::vector< Author > & GetAuthors() const
Definition: Citation.h:69
void push_back(PB_Ts &&...args)
Definition: vector.h:189
Definition: Citation.h:25
Citation(CITE_TYPE in_type=UNKNOWN)
Definition: Citation.h:63
Citation & SetYear(T &&val)
Definition: Citation.h:107
void PrintUNKNOWN(std::ostream &out=std::cout)
Definition: Citation.h:139
size_t size() const
Definition: vector.h:151
void emplace_back(ARGS &&...args)
Definition: vector.h:219
const bool HasKeyword(const std::string &kw) const
Definition: Citation.h:72
~Citation()
Definition: Citation.h:65
Citation & AddAuthor(ARGS &&...args)
Definition: Citation.h:91
CITE_TYPE
Definition: Citation.h:25
Definition: Citation.h:25
static const PrintStr endl("<br>")
Pre-define emp::endl to insert a "<br>" and thus acting like a newline.
Citation & SetBookTitle(T &&val)
Definition: Citation.h:105
Definition: Citation.h:25
Definition: Citation.h:26
Definition: Citation.h:26
Definition: Citation.h:26
const std::string & GetVal(const std::string &setting) const
Definition: Citation.h:76
static std::string to_lower(std::string value)
Convert a string to all lowercase.
Definition: string_utils.h:132
Definition: Citation.h:25
void PrintAuthors(std::ostream &out=std::cout)
Definition: Citation.h:124
void PrintPROCEEDINGS(std::ostream &out=std::cout)
Definition: Citation.h:150
CITE_TYPE GetType() const
Definition: Citation.h:68
const std::set< std::string > & GetKeywords() const
Definition: Citation.h:71
const std::string & GetBookTitle() const
Definition: Citation.h:82
Citation & SetTitle(T &&val)
Definition: Citation.h:103
void PrintARTICLE(std::ostream &out=std::cout)
Definition: Citation.h:140
Definition: Citation.h:25
If we are in emscripten, make sure to include the header.
Definition: array.h:37
const std::string & GetEndPage() const
Definition: Citation.h:88
Build a debug wrapper emp::vector around std::vector.
Definition: vector.h:42
Definition: Citation.h:26
Citation & SetPages(T &&p1, T &&p2)
Definition: Citation.h:112
T & back()
Definition: vector.h:183
void PrintPHD_THESIS(std::ostream &out=std::cout)
Definition: Citation.h:149
void PrintUNPUBLISHED(std::ostream &out=std::cout)
Definition: Citation.h:152
Citation & SetVal(const std::string &setting, T &&val)
Definition: Citation.h:98
void PrintERROR(std::ostream &out=std::cout)
Definition: Citation.h:138
const auto & FindRef(const MAP_T &in_map, const KEY_T &key, const typename MAP_T::mapped_type &dval)
Definition: map_utils.h:39
void PrintCONFERENCE(std::ostream &out=std::cout)
Definition: Citation.h:143
void PrintMISC(std::ostream &out=std::cout)
Definition: Citation.h:148
const std::string & GetJournal() const
Definition: Citation.h:81
Definition: Citation.h:26
const std::string & GetNumber() const
Definition: Citation.h:85
Citation & operator=(const Citation &)=default
const std::string & GetStartPage() const
Definition: Citation.h:87
Citation & SetNumber(T &&val)
Definition: Citation.h:108
Citation & SetVolume(T &&val)
Definition: Citation.h:106
Definition: Citation.h:26
Citation & SetJournal(T &&val)
Definition: Citation.h:104
const std::string & GetYear() const
Definition: Citation.h:84
const emp::vector< std::string > & GetNotes() const
Definition: Citation.h:70
Citation & SetStartPage(T &&val)
Definition: Citation.h:110