Lucene++ - a full-featured, c++ search engine
API Documentation


 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
VariantUtils.h
Go to the documentation of this file.
1 
2 // Copyright (c) 2009-2014 Alan Wright. All rights reserved.
3 // Distributable under the terms of either the Apache License (Version 2.0)
4 // or the GNU Lesser General Public License.
6 
7 #ifndef VARIANTUTILS_H
8 #define VARIANTUTILS_H
9 
10 #include <boost/any.hpp>
11 #include "Lucene.h"
12 #include "MiscUtils.h"
13 
14 namespace Lucene {
15 
16 class LPPAPI VariantUtils {
17 public:
18  template <typename TYPE>
19  static TYPE get(const boost::any& var) {
20  return var.type() == typeid(TYPE) ? boost::any_cast<TYPE>(var) : TYPE();
21  }
22 
23  template <typename TYPE, typename VAR>
24  static TYPE get(VAR var) {
25  return var.type() == typeid(TYPE) ? boost::get<TYPE>(var) : TYPE();
26  }
27 
28  template <typename TYPE, typename VAR>
29  static bool typeOf(VAR var) {
30  return (var.type() == typeid(TYPE));
31  }
32 
33  static VariantNull null() {
34  return VariantNull();
35  }
36 
37  static bool isNull(const boost::any& var) {
38  return var.empty();
39  }
40 
41  template <typename VAR>
42  static bool isNull(VAR var) {
43  return typeOf<VariantNull>(var);
44  }
45 
46  template <typename VAR>
47  static int32_t hashCode(VAR var) {
48  if (typeOf<String>(var)) {
49  return StringUtils::hashCode(get<String>(var));
50  }
51  if (typeOf<int32_t>(var)) {
52  return get<int32_t>(var);
53  }
54  if (typeOf<int64_t>(var)) {
55  return (int32_t)get<int64_t>(var);
56  }
57  if (typeOf<double>(var)) {
58  int64_t longBits = MiscUtils::doubleToLongBits(get<double>(var));
59  return (int32_t)(longBits ^ (longBits >> 32));
60  }
61  if (typeOf< Collection<uint8_t> >(var)) {
62  return get< Collection<uint8_t> >(var).hashCode();
63  }
64  if (typeOf< Collection<int32_t> >(var)) {
65  return get< Collection<int32_t> >(var).hashCode();
66  }
67  if (typeOf< Collection<int64_t> >(var)) {
68  return get< Collection<int64_t> >(var).hashCode();
69  }
70  if (typeOf< Collection<double> >(var)) {
71  return get< Collection<double> >(var).hashCode();
72  }
73  if (typeOf< Collection<String> >(var)) {
74  return get< Collection<String> >(var).hashCode();
75  }
76  if (typeOf<LuceneObjectPtr>(var)) {
77  return get<LuceneObjectPtr>(var)->hashCode();
78  }
79  return 0;
80  }
81 
82  template <typename FIRST, typename SECOND>
83  static bool equalsType(FIRST first, SECOND second) {
84  return (first.type() == second.type());
85  }
86 
87  template <typename FIRST, typename SECOND>
88  static bool equals(FIRST first, SECOND second) {
89  return first.type() == second.type() ? (first == second) : false;
90  }
91 
92  template <typename VAR>
93  static int32_t compareTo(VAR first, VAR second) {
94  return first < second ? -1 : (first == second ? 0 : 1);
95  }
96 };
97 
98 }
99 
100 #endif

clucene.sourceforge.net