1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// found in the LICENSE file.
4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifndef SANDBOX_LINUX_BPF_DSL_CONS_H_
6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define SANDBOX_LINUX_BPF_DSL_CONS_H_
7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/memory/ref_counted.h"
9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "sandbox/sandbox_export.h"
10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
11116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace sandbox {
12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Cons provides an immutable linked list abstraction as commonly
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// provided in functional programming languages like Lisp or Haskell.
15116680a4aac90f2aa7413d9095a592090648e557Ben Murdochtemplate <typename T>
16116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass Cons : public base::RefCounted<Cons<T> > {
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public:
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // List provides an abstraction for referencing a list of zero or
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // more Cons nodes.
20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  typedef scoped_refptr<const Cons<T> > List;
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Return this node's head element.
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const T& head() const { return head_; }
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Return this node's tail element.
26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  List tail() const { return tail_; }
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Construct a new List using |head| and |tail|.
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  static List Make(const T& head, List tail) {
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return make_scoped_refptr(new const Cons<T>(head, tail));
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private:
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  Cons(const T& head, List tail) : head_(head), tail_(tail) {}
35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual ~Cons() {}
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  T head_;
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  List tail_;
39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  friend class base::RefCounted<Cons<T> >;
41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(Cons);
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace sandbox
45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif  // SANDBOX_LINUX_BPF_DSL_CONS_H_
47