Github user phrocker commented on a diff in the pull request:

    https://github.com/apache/nifi-minifi-cpp/pull/460#discussion_r241199779
  
    --- Diff: libminifi/include/core/state/Value.h ---
    @@ -74,94 +157,215 @@ class BoolValue : public Value {
       explicit BoolValue(bool value)
           : Value(value ? "true" : "false"),
             value(value) {
    +    setTypeId<bool>();
    +  }
     
    +  explicit BoolValue(const std::string &strvalue)
    +      : Value(strvalue) {
    +    bool l;
    +    std::istringstream(strvalue) >> std::boolalpha >> l;
    +    value = l;  // avoid warnings
       }
    -  bool getValue() {
    +
    +  bool getValue() const {
         return value;
       }
      protected:
    +
    +  virtual bool getValue(int &ref) {
    +    if (ref == 1) {
    +      ref = true;
    +      return true;
    +    } else if (ref == 0) {
    +      ref = false;
    +      return true;
    +    } else {
    +      return false;
    +    }
    +  }
    +
    +  virtual bool getValue(int64_t &ref) {
    +    if (ref == 1) {
    +      ref = true;
    +      return true;
    +    } else if (ref == 0) {
    +      ref = false;
    +      return true;
    +    } else {
    +      return false;
    +    }
    +  }
    +
    +  virtual bool getValue(uint64_t &ref) {
    +    if (ref == 1) {
    +      ref = true;
    +      return true;
    +    } else if (ref == 0) {
    +      ref = false;
    +      return true;
    +    } else {
    +      return false;
    +    }
    +  }
    +
    +  virtual bool getValue(bool &ref) {
    +    ref = value;
    +    return true;
    +  }
    +
       bool value;
     };
     
    -class Int64Value : public Value {
    +class UInt64Value : public Value {
      public:
    -  explicit Int64Value(uint64_t value)
    +  explicit UInt64Value(uint64_t value)
           : Value(std::to_string(value)),
             value(value) {
    +    setTypeId<uint64_t>();
    +  }
     
    +  explicit UInt64Value(const std::string &strvalue)
    +      : Value(strvalue),
    +        value(std::stoull(strvalue)) {
    +    setTypeId<uint64_t>();
       }
    -  uint64_t getValue() {
    +
    +  uint64_t getValue() const {
         return value;
       }
      protected:
    +
    +  virtual bool getValue(int &ref) {
    +    return false;
    +  }
    +
    +  virtual bool getValue(int64_t &ref) {
    +    if (value < std::numeric_limits<int64_t>::max()) {
    +      ref = value;
    +      return true;
    +    }
    +    return false;
    +  }
    +
    +  virtual bool getValue(uint64_t &ref) {
    +    ref = value;
    +    return true;
    +  }
    +
    +  virtual bool getValue(bool &ref) {
    +    return false;
    +  }
    +
       uint64_t value;
     };
     
    +class Int64Value : public Value {
    + public:
    +  explicit Int64Value(int64_t value)
    +      : Value(std::to_string(value)),
    +        value(value) {
    +    setTypeId<int64_t>();
    +  }
    +  explicit Int64Value(const std::string &strvalue)
    +      : Value(strvalue),
    +        value(std::stoll(strvalue)) {
    +    setTypeId<int64_t>();
    +  }
    +
    +  int64_t getValue() {
    +    return value;
    +  }
    + protected:
    +
    +  virtual bool getValue(int &ref) {
    +    return false;
    +  }
    +
    +  virtual bool getValue(int64_t &ref) {
    +    ref = value;
    +    return true;
    +  }
    +
    +  virtual bool getValue(uint64_t &ref) {
    +    if (value >= 0) {
    +      ref = value;
    +      return true;
    +    }
    +    return true;
    +  }
    +
    +  virtual bool getValue(bool &ref) {
    +    return false;
    +  }
     
    -static inline std::shared_ptr<Value> createValue(
    -    const bool &object) {
    +  int64_t value;
    +};
    +
    +static inline std::shared_ptr<Value> createValue(const bool &object) {
       return std::make_shared<BoolValue>(object);
     }
     
    -static inline std::shared_ptr<Value> createValue(
    -    const char *object) {
    +static inline std::shared_ptr<Value> createValue(const char *object) {
       return std::make_shared<Value>(object);
     }
     
    -static inline std::shared_ptr<Value> createValue(
    -    char *object) {
    +static inline std::shared_ptr<Value> createValue(char *object) {
       return std::make_shared<Value>(std::string(object));
     }
     
    -static inline std::shared_ptr<Value> createValue(
    -    const std::string &object) {
    +static inline std::shared_ptr<Value> createValue(const std::string 
&object) {
       return std::make_shared<Value>(object);
     }
     
    -
    -static inline std::shared_ptr<Value> createValue(
    -    const uint32_t &object) {
    -  return std::make_shared<Int64Value>(object);
    +static inline std::shared_ptr<Value> createValue(const uint32_t &object) {
    +  return std::make_shared<UInt64Value>(object);
    +}
    +#if ( defined(__APPLE__) || defined(__MACH__) || defined(DARWIN) )
    +static inline std::shared_ptr<Value> createValue(const size_t &object) {
    +  return std::make_shared<UInt64Value>(object);
    +}
    +#endif
    +static inline std::shared_ptr<Value> createValue(const uint64_t &object) {
    +  return std::make_shared<UInt64Value>(object);
     }
    -static inline std::shared_ptr<Value> createValue(
    -    const uint64_t &object) {
    +
    +static inline std::shared_ptr<Value> createValue(const int64_t &object) {
       return std::make_shared<Int64Value>(object);
     }
     
    -static inline std::shared_ptr<Value> createValue(
    -    const int &object) {
    +static inline std::shared_ptr<Value> createValue(const int &object) {
       return std::make_shared<IntValue>(object);
     }
     
    -
     /**
      * Purpose: ValueNode is the AST container for a value
      */
     class ValueNode {
      public:
       ValueNode()
           : value_(nullptr) {
    -
       }
     
    +  ValueNode(ValueNode &&vn) = default;
    +  ValueNode(const ValueNode &vn) = default;
    +
       /**
        * Define the representations and eventual storage relationships through
        * createValue
        */
       template<typename T>
    -  auto operator=(
    -      const T ref) -> typename std::enable_if<std::is_same<T, int >::value 
||
    -      std::is_same<T, uint32_t >::value ||
    -      std::is_same<T, uint64_t >::value ||
    -      std::is_same<T, bool >::value ||
    -      std::is_same<T, char* >::value ||
    -      std::is_same<T, const char* >::value ||
    -      std::is_same<T, std::string>::value,ValueNode&>::type {
    +  auto operator=(const T ref) -> typename std::enable_if<std::is_same<T, 
int >::value ||
    --- End diff --
    
    There were a few excluded types. Once I get around to implementing those 
I'd prefer to use integral too


---

Reply via email to