<commit_before>/*
 * Copyright (c) 2015, Georgia Tech Research Corporation
 * All rights reserved.
 *
 * Author(s): <NAME> <<EMAIL>>
 *
 * Georgia Tech Graphics Lab and Humanoid Robotics Lab
 *
 * Directed by Prof. C. <NAME> and Prof. <NAME>
 * <<EMAIL>> <<EMAIL>>
 *
 * This file is provided under the following "BSD-style" License:
 *   Redistribution and use in source and binary forms, with or
 *   without modification, are permitted provided that the following
 *   conditions are met:
 *   * Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *   * Redistributions in binary form must reproduce the above
 *     copyright notice, this list of conditions and the following
 *     disclaimer in the documentation and/or other materials provided
 *     with the distribution.
 *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
 *   CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
 *   INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 *   MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 *   DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
 *   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
 *   USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
 *   AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 *   LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
 *   ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 *   POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef DART_COMMON_URI_H_
#define DART_COMMON_URI_H_

#include <string>
#include "dart/common/Deprecated.h"

namespace dart {
namespace common {

class UriComponent final
{
public:
  using value_type = std::string;
  using reference_type = value_type&;
  using reference_const_type = const value_type&;
  using pointer_type = value_type*;
  using pointer_const_type = const value_type*;

  UriComponent();
  UriComponent(reference_const_type _value);

  operator bool() const;

  bool operator !() const;

  UriComponent& operator =(reference_const_type _value);

  reference_type operator *();
  reference_const_type operator *() const;

  pointer_type operator ->();
  pointer_const_type operator ->() const;

  void assign(reference_const_type _value);
  void reset();

  reference_type get();
  reference_const_type get() const;

  reference_type get_value_or(reference_type _default);
  reference_const_type get_value_or(reference_const_type _default) const;

private:
  bool mExists;
  std::string mValue;
};

/// The Uri class provides URI parsing and merging functionality based on RFC
/// 3986.
class Uri final
{
public:

  // We expose the URI components as public member because we hope to keep Uri
  // class as close to a mutable struct as possible. Many ResourceRetreiver
  // classes rewrite URIs to other types of URIs (e.g, resolve 'package://' URIs
  // to 'file://' URIs), which is easier to implemet if you have direct access
  // to the URI components.

  /// Scheme, e.g. 'http', 'file', 'package'
  UriComponent mScheme;

  /// Authority, e.g. 'google.com', 'en.wikipedia.org'
  UriComponent mAuthority;

  /// Path, e.g. '/index.html', '/foo/bar.txt'
  UriComponent mPath;

  /// Query string, i.e. the part of the URI after the ?
  UriComponent mQuery;

  /// Fragment, e.g. the part of the URI after the #
  UriComponent mFragment;

  /// Constructor
  Uri() = default;

  /// Constructor that takes a URI string or a local path. Internally, this is
  /// equivalent to calling fromStringOrPath(_input) after default constructor.
  Uri(const std::string& _input);

  /// Constructor that takes a URI string or a local path. Internally, this is
  /// equivalent to calling fromStringOrPath(_input) after default constructor.
  Uri(const char* _input);

  /// Clear the URI by reset()ing all components.
  void clear();

  /// Parse a URI from a string; return success.
  bool fromString(const std::string& _input);

  /// Parse a local path (i.e. URI with no schema) from a string; return
  /// success. Note that the input path should be absolute path.
  bool fromPath(const std::string& _path);

  /// Parse a URI or local path (i.e. URI with no schema) from a string; return
  /// success. We assume that any string without a scheme is a path.
  bool fromStringOrPath(const std::string& _input);

  /// Resolve a relative path reference; return success.
  bool fromRelativeUri(const std::string& _base, const std::string& _relative,
                       bool _strict = false);

  /// Resolve a relative path reference; return success.
  bool fromRelativeUri(const char* _base, const char* _relative,
                       bool _strict = false);

  /// Resolve a relative path reference; return success.
  bool fromRelativeUri(const Uri& _base, const std::string& _relative,
                       bool _strict = false);

  /// Resolve a relative path reference; return success.
  bool fromRelativeUri(const Uri& _base, const char* _relative,
                       bool _strict = false);

  /// Resolve a relative path reference; return success.
  bool fromRelativeUri(const Uri& _base, const Uri& _relative,
                       bool _strict = false);

  /// Combine the parts of the URI into a string.
  std::string toString() const;

  /// Create URI from a string.
  static Uri createFromString(const std::string& _input);

  /// Create file URI from a string.
  static Uri createFromPath(const std::string& _path);

  /// Create URI resolving a relative path reference.
  static Uri createFromRelativeUri(const std::string& _base,
                                   const std::string& _relative,
                                   bool _strict = false);

  /// Create URI resolving a relative path reference.
  static Uri createFromRelativeUri(const Uri& _base,
                                   const Uri& _relative,
                                   bool _strict = false);

  /// Parse a URI from a string; return an empty string on failure.
  static std::string getUri(const std::string& _input);

  /// Parse a file URI from a string; return an empty string on failure.
  static std::string getFileUri(const std::string& _path);

  /// Resolve a relative path reference; return an empty string on failure.
  static std::string getRelativeUri(const std::string& _base,
                                    const std::string& _relative,
                                    bool _strict = false);

  /// Resolve a relative path reference; return an empty string on failure.
  static std::string getRelativeUri(const Uri& _base,
                                    const Uri& _relative,
                                    bool _strict = false);

  /// Get the path component of the URI as a string.
  std::string getPath() const;

  /// Get the path in the local filesystem as a string. You should use this
  /// function rather than getPath() if you are trying to access a local file.
  /// Note that this function is identical to getPath() for Unix systems, but
  /// differ by the leading '/' on Windows.
  std::string getFilesystemPath() const;

private:
  /// Implement section 5.2.3 of RFC 3986.
  static std::string mergePaths(const Uri& _base, const Uri& _relative);

  /// Implement section 5.2.4 of RFC 3986.
  static std::string removeDotSegments(const std::string& _path);
};

} // namespace common
} // namespace dart

#endif // ifndef DART_COMMON_URI_H_
<commit_msg>Change Uri from class to struct to follow our convention<commit_after>/*
 * Copyright (c) 2015, Georgia Tech Research Corporation
 * All rights reserved.
 *
 * Author(s): <NAME> <<EMAIL>>
 *
 * Georgia Tech Graphics Lab and Humanoid Robotics Lab
 *
 * Directed by Prof. C. <NAME> and Prof. <NAME>
 * <<EMAIL>> <<EMAIL>>
 *
 * This file is provided under the following "BSD-style" License:
 *   Redistribution and use in source and binary forms, with or
 *   without modification, are permitted provided that the following
 *   conditions are met:
 *   * Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *   * Redistributions in binary form must reproduce the above
 *     copyright notice, this list of conditions and the following
 *     disclaimer in the documentation and/or other materials provided
 *     with the distribution.
 *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
 *   CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
 *   INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 *   MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 *   DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
 *   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
 *   USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
 *   AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 *   LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
 *   ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 *   POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef DART_COMMON_URI_H_
#define DART_COMMON_URI_H_

#include <string>
#include "dart/common/Deprecated.h"

namespace dart {
namespace common {

class UriComponent final
{
public:
  using value_type = std::string;
  using reference_type = value_type&;
  using reference_const_type = const value_type&;
  using pointer_type = value_type*;
  using pointer_const_type = const value_type*;

  UriComponent();
  UriComponent(reference_const_type _value);

  operator bool() const;

  bool operator !() const;

  UriComponent& operator =(reference_const_type _value);

  reference_type operator *();
  reference_const_type operator *() const;

  pointer_type operator ->();
  pointer_const_type operator ->() const;

  void assign(reference_const_type _value);
  void reset();

  reference_type get();
  reference_const_type get() const;

  reference_type get_value_or(reference_type _default);
  reference_const_type get_value_or(reference_const_type _default) const;

private:
  bool mExists;
  std::string mValue;
};

/// The Uri struct provides URI parsing and merging functionality based on RFC
/// 3986.
///
/// We have Uri as a struct rather than class to expose member variables. Many
/// ResourceRetreiver classes rewrite URIs to other types of URIs (e.g, resolve
/// 'package://' URIs to 'file://' URIs), which is easier to implemet if you
/// have direct access to the URI components.
struct Uri final
{
  /// Scheme, e.g. 'http', 'file', 'package'
  UriComponent mScheme;

  /// Authority, e.g. 'google.com', 'en.wikipedia.org'
  UriComponent mAuthority;

  /// Path, e.g. '/index.html', '/foo/bar.txt'
  UriComponent mPath;

  /// Query string, i.e. the part of the URI after the ?
  UriComponent mQuery;

  /// Fragment, e.g. the part of the URI after the #
  UriComponent mFragment;

  /// Constructor
  Uri() = default;

  /// Constructor that takes a URI string or a local path. Internally, this is
  /// equivalent to calling fromStringOrPath(_input) after default constructor.
  Uri(const std::string& _input);

  /// Constructor that takes a URI string or a local path. Internally, this is
  /// equivalent to calling fromStringOrPath(_input) after default constructor.
  Uri(const char* _input);

  /// Clear the URI by reset()ing all components.
  void clear();

  /// Parse a URI from a string; return success.
  bool fromString(const std::string& _input);

  /// Parse a local path (i.e. URI with no schema) from a string; return
  /// success. Note that the input path should be absolute path.
  bool fromPath(const std::string& _path);

  /// Parse a URI or local path (i.e. URI with no schema) from a string; return
  /// success. We assume that any string without a scheme is a path.
  bool fromStringOrPath(const std::string& _input);

  /// Resolve a relative path reference; return success.
  bool fromRelativeUri(const std::string& _base, const std::string& _relative,
                       bool _strict = false);

  /// Resolve a relative path reference; return success.
  bool fromRelativeUri(const char* _base, const char* _relative,
                       bool _strict = false);

  /// Resolve a relative path reference; return success.
  bool fromRelativeUri(const Uri& _base, const std::string& _relative,
                       bool _strict = false);

  /// Resolve a relative path reference; return success.
  bool fromRelativeUri(const Uri& _base, const char* _relative,
                       bool _strict = false);

  /// Resolve a relative path reference; return success.
  bool fromRelativeUri(const Uri& _base, const Uri& _relative,
                       bool _strict = false);

  /// Combine the parts of the URI into a string.
  std::string toString() const;

  /// Create URI from a string.
  static Uri createFromString(const std::string& _input);

  /// Create file URI from a string.
  static Uri createFromPath(const std::string& _path);

  /// Create URI resolving a relative path reference.
  static Uri createFromRelativeUri(const std::string& _base,
                                   const std::string& _relative,
                                   bool _strict = false);

  /// Create URI resolving a relative path reference.
  static Uri createFromRelativeUri(const Uri& _base,
                                   const Uri& _relative,
                                   bool _strict = false);

  /// Parse a URI from a string; return an empty string on failure.
  static std::string getUri(const std::string& _input);

  /// Parse a file URI from a string; return an empty string on failure.
  static std::string getFileUri(const std::string& _path);

  /// Resolve a relative path reference; return an empty string on failure.
  static std::string getRelativeUri(const std::string& _base,
                                    const std::string& _relative,
                                    bool _strict = false);

  /// Resolve a relative path reference; return an empty string on failure.
  static std::string getRelativeUri(const Uri& _base,
                                    const Uri& _relative,
                                    bool _strict = false);

  /// Get the path component of the URI as a string.
  std::string getPath() const;

  /// Get the path in the local filesystem as a string. You should use this
  /// function rather than getPath() if you are trying to access a local file.
  /// Note that this function is identical to getPath() for Unix systems, but
  /// differ by the leading '/' on Windows.
  std::string getFilesystemPath() const;

private:
  /// Implement section 5.2.3 of RFC 3986.
  static std::string mergePaths(const Uri& _base, const Uri& _relative);

  /// Implement section 5.2.4 of RFC 3986.
  static std::string removeDotSegments(const std::string& _path);
};

} // namespace common
} // namespace dart

#endif // ifndef DART_COMMON_URI_H_

{'fraction_non_alphanumeric': 0.08725980521189787, 'fraction_numerical': 0.002895498815477757, 'mean_word_length': 2.9658141962421714, 'pattern_counts': {'":': 0, '<': 23, '<?xml version=': 0, '>': 27, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 20, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1409068', 'n_tokens_mistral': 4304, 'n_tokens_neox': 3998, 'n_words': 1738}