1 //
2 // CDDL HEADER START
3 //
4 // The contents of this file are subject to the terms of the Common Development
5 // and Distribution License Version 1.0 (the "License").
6 //
7 // You can obtain a copy of the license at
8 // http://www.opensource.org/licenses/CDDL-1.0.  See the License for the
9 // specific language governing permissions and limitations under the License.
10 //
11 // When distributing Covered Code, include this CDDL HEADER in each file and
12 // include the License file in a prominent location with the name LICENSE.CDDL.
13 // If applicable, add the following below this CDDL HEADER, with the fields
14 // enclosed by brackets "[]" replaced with your own identifying information:
15 //
16 // Portions Copyright (c) [yyyy] [name of copyright owner]. All rights reserved.
17 //
18 // CDDL HEADER END
19 //
20 
21 //
22 // Copyright (c) 2016--2020, Regents of the University of Minnesota.
23 // All rights reserved.
24 //
25 // Contributors:
26 //    Ryan S. Elliott
27 //
28 
29 //
30 // Release: This file is part of the kim-api-2.2.1 package.
31 //
32 
33 #include <map>
34 
35 #ifndef KIM_LANGUAGE_NAME_HPP_
36 #include "KIM_LanguageName.hpp"
37 #endif
38 
39 namespace KIM
40 {
41 // Order doesn't matter as long as all values are unique
42 namespace LANGUAGE_NAME
43 {
44 #include "KIM_LanguageName.inc"
45 LanguageName const cpp(ID_cpp);
46 LanguageName const c(ID_c);
47 LanguageName const fortran(ID_fortran);
48 
49 namespace
50 {
51 typedef std::map<LanguageName const, std::string, LANGUAGE_NAME::Comparator>
52     StringMap;
53 
GetStringMap()54 StringMap const GetStringMap()
55 {
56   StringMap m;
57   m[cpp] = "cpp";
58   m[c] = "c";
59   m[fortran] = "fortran";
60   return m;
61 }
62 
63 StringMap const languageNameToString = GetStringMap();
64 std::string const languageNameUnknown("unknown");
65 }  // namespace
66 
67 
GetNumberOfLanguageNames(int * const numberOfLanguageNames)68 void GetNumberOfLanguageNames(int * const numberOfLanguageNames)
69 {
70   *numberOfLanguageNames = languageNameToString.size();
71 }
72 
GetLanguageName(int const index,LanguageName * const languageName)73 int GetLanguageName(int const index, LanguageName * const languageName)
74 {
75   int numberOfLanguageNames;
76   GetNumberOfLanguageNames(&numberOfLanguageNames);
77   if ((index < 0) || (index >= numberOfLanguageNames)) return true;
78 
79   StringMap::const_iterator iter = languageNameToString.begin();
80   for (int i = 0; i < index; ++i) ++iter;
81   *languageName = iter->first;
82   return false;  // no error
83 }
84 }  // namespace LANGUAGE_NAME
85 
86 // implementation of LanguageName
LanguageName()87 LanguageName::LanguageName() {}
LanguageName(int const id)88 LanguageName::LanguageName(int const id) : languageNameID(id) {}
LanguageName(std::string const & str)89 LanguageName::LanguageName(std::string const & str)
90 {
91   languageNameID = -1;
92   for (LANGUAGE_NAME::StringMap::const_iterator iter
93        = LANGUAGE_NAME::languageNameToString.begin();
94        iter != LANGUAGE_NAME::languageNameToString.end();
95        ++iter)
96   {
97     if (iter->second == str)
98     {
99       languageNameID = (iter->first).languageNameID;
100       break;
101     }
102   }
103 }
104 
Known() const105 bool LanguageName::Known() const
106 {
107   int numberOfLanguageNames;
108   LANGUAGE_NAME::GetNumberOfLanguageNames(&numberOfLanguageNames);
109 
110   for (int i = 0; i < numberOfLanguageNames; ++i)
111   {
112     LanguageName langName;
113     LANGUAGE_NAME::GetLanguageName(i, &langName);
114 
115     if (*this == langName) { return true; }
116   }
117 
118   return false;
119 }
120 
operator ==(LanguageName const & rhs) const121 bool LanguageName::operator==(LanguageName const & rhs) const
122 {
123   return languageNameID == rhs.languageNameID;
124 }
operator !=(LanguageName const & rhs) const125 bool LanguageName::operator!=(LanguageName const & rhs) const
126 {
127   return languageNameID != rhs.languageNameID;
128 }
129 
ToString() const130 std::string const & LanguageName::ToString() const
131 {
132   LANGUAGE_NAME::StringMap::const_iterator iter
133       = LANGUAGE_NAME::languageNameToString.find(*this);
134   if (iter == LANGUAGE_NAME::languageNameToString.end())
135     return LANGUAGE_NAME::languageNameUnknown;
136   else
137     return iter->second;
138 }
139 }  // namespace KIM
140