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()54StringMap 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)68void GetNumberOfLanguageNames(int * const numberOfLanguageNames) 69 { 70 *numberOfLanguageNames = languageNameToString.size(); 71 } 72 GetLanguageName(int const index,LanguageName * const languageName)73int 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()87LanguageName::LanguageName() {} LanguageName(int const id)88LanguageName::LanguageName(int const id) : languageNameID(id) {} LanguageName(std::string const & str)89LanguageName::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() const105bool 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) const121bool LanguageName::operator==(LanguageName const & rhs) const 122 { 123 return languageNameID == rhs.languageNameID; 124 } operator !=(LanguageName const & rhs) const125bool LanguageName::operator!=(LanguageName const & rhs) const 126 { 127 return languageNameID != rhs.languageNameID; 128 } 129 ToString() const130std::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